Search code examples
fileopenfiledialogoctave

Octave select a file?


Does Octave have a good way to let the user select an input file? I've seen code like this for Matlab, but doesn't work in Octave.

A gui based method would be preferred, but some sort of command-line choice would work also. It would be great if there were some way to do this that would work in both Matlab and Octave.

I found this for Matlab but it does not work in Octave, even when you install Octave Forge Java package for the listdlg function. In Octave, dir() gives you:

  647x1 struct array containing the fields:

    name
    date
    bytes
    isdir
    datenum
    statinfo

but I don't know how to convert this to an array of strings listdlg expects.


Solution

  • You have already the Octave Forge java package installed, so you can create instances of any java class and call any java method.

    For example to create a JFileChooser and call the JFileChooser.showOpenDialog(Component parent) method:

    frame = javaObject("javax.swing.JFrame");
    frame.setBounds(0,0,100,100);
    frame.setVisible(true);
    fc = javaObject ("javax.swing.JFileChooser")
    returnVal = fc.showOpenDialog(frame);
    file = fc.getSelectedFile();
    file.getName()
    

    Btw. I had some troubles installing the package. Here is a fix for Ubuntu. that worked also for my Debian Testing.

    EDIT

    @NoBugs In reply to your comment:

    If you need to use listdlg you can do the following:

    d = dir;
    str = {d.name};
    [sel,ok] = listdlg('PromptString','Select a file:',...
                    'SelectionMode','single',...
                    'ListString',str);
    if ok == 1
        disp(str{sel(1)});
    end
    

    This should be compatible with matlab, by I cannot test it right now.

    If you want to select multiple files use this:

    d = dir;
    str = {d.name};
    [sel,ok] = listdlg('PromptString','Select a file:',...
                    'SelectionMode','multiple',...
                    'ListString',str);
    if ok == 1
       imax = length(sel);
       for i=1:1:imax
          disp(str{sel(i)});
       end
    end