Is there a function that returns the list of files currently open in the editor?
I frequently work with 25+ m-files open. When quitting and restarting MATLAB, the open files are reopened as desired (preferences setting). However, in the rare case that MATLAB crashes, I have often restarted to find an empty editor. It is a pain to manually select and reopen each m-file. If there is a function for getting the list, I can run it in my finish.m script and save the results. That way I always have a way to reload open files.

 Akzeptierte Antwort

Adam Schuyler
Adam Schuyler am 21 Sep. 2011

0 Stimmen

I found a way. It's not pretty, but in case someone else might find this useful...
In my user folder (on OSX) there is .matlab/R2009a/MATLABDesktop.xml
There is a LOT of stuff in this file, but I found many entries of the form:
<ClientData EditorFileName="FULL PATH TO ONE OF MY OPEN M-FILES"/>
All my m-files are at /Volumes/data/adam/...
The following grep commands find the desired lines in the xml file and extract JUST the m-file paths:
grep 'EditorFileName' MATLABDesktop.xml | grep -o '\"/Volumes/.*\.m\"'
Copy/paste the list into a cell array and
edit(X{:})
The API referenced by Sean de seems like a much nicer option for those using newer releases.

1 Kommentar

Sam Zebrado
Sam Zebrado am 16 Nov. 2021
Love this solution: it seems to be able to save the layout as well

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (8)

Kurt von Niederhausen
Kurt von Niederhausen am 22 Apr. 2021

4 Stimmen

function saveListOfOpenFiles(listFile)
fid = fopen(listFile,'w');
f=matlab.desktop.editor.getAll;
% filenames=cellfun(@(s)s(find(s==filesep,1,'last')+1:end-2),{f.Filename},'uniformoutput',false);
filenames=cellfun(@(s)s,{f.Filename},'uniformoutput',false);
for(i = 1:length(filenames))
fname = filenames{i};
fprintf(fid, '%s \n', fname);
end
fclose(fid);
end
function openFilesInList(listFile)
fid = fopen(listFile);
while(~feof(fid))
file = fgetl(fid);
fprintf('Opending File: %s \n', file);
edit(file);
end
fclose(fid);
end
I created two Matlab Functions: saveListOfOpenFiles and openFilesInList. Now you can just call this at any time you have the editor the way you want and then retrieve the open files with the commands:
saveListOfOpenFiles('List_Open_Files.txt')
openFilesInList('List_Open_FIles.txt')
Jan
Jan am 21 Sep. 2011

2 Stimmen

The editor API has not changed, it is only documented now.
ES = com.mathworks.mlservices.MLEditorServices;
OpenFiles = ES.builtinGetOpenDocumentNames;
C = cell(1, numel(OpenFiles));
for i = 1:length(C)
C{i} = char(OpenFiles(i));
end

3 Kommentare

Adam Schuyler
Adam Schuyler am 21 Sep. 2011
Hi Jan. Thanks for the info. Interesting... the API function calls in the article referenced by Sean de above are not recognized in R2009a. The code you have provided does run in R2009a, but (with 48 open m-files) I get C as a 48 element cell array, with each cell EMPTY.
A possible explanation...
I recently upgraded from OSX 10.5 to 10.6. This rendered R2009a almost unusable - it takes 10 seconds to respond to each mouse click/command line entry. My guess is that the OS upgrade did something to the JAVA environment that made MATLAB very mad. I installed 2010a (my university is a bit behind) and it works as expected. I want to take my 48 open m-files in R2009a and open them in R2010a - hence my original question. It is likely that your solution works for others, but just not on my somewhat crippled R2009a installation.
With modern Matlab versions:
docs = matlab.editor.getAll;
Name = {docs.Filename};
Andrew Sandeman
Andrew Sandeman am 29 Aug. 2022
*typo: matlab.desktop.editor.getAll
but otherwise works well

Melden Sie sich an, um zu kommentieren.

Peter O'Connor
Peter O'Connor am 2 Mär. 2012

1 Stimme

Yep, at least on R2011A there is.
f=matlab.desktop.editor.getAll;
If you just want the filenames, then go
filenames=cellfun(@(s)s(find(s==filesep,1,'last')+1:end-2),{f.Filename},'uniformoutput',false);

1 Kommentar

Dan
Dan am 4 Jun. 2013
Peter,
I can't kind help on this call. Is there a way to restore the list?

Melden Sie sich an, um zu kommentieren.

alieed
alieed am 4 Jan. 2020

1 Stimme

Try this
% creat list of your m-files
clear
clc
openFiles = matlab.desktop.editor.getAll;
mfileNames = {openFiles.Filename};
save (['mfileNames' date],'mfileNames')
f=char(mfileNames(35))
% reload them in the future whenever you want
load('mfileNames04-Jan-2020.mat')
for i=1:length(mfileNames)
A=open (char(mfileNames(i)))
end
% All the best :)@ ali2020

2 Kommentare

Michel Bertrand
Michel Bertrand am 5 Dez. 2020
This does not pick mlx files in the editor. I am still looking for a solution
Michel Bertrand
Michel Bertrand am 5 Dez. 2020
oops.... it does work with R2020b, and I could make it work with R2019b.

Melden Sie sich an, um zu kommentieren.

Sean de Wolski
Sean de Wolski am 21 Sep. 2011

0 Stimmen

See this question and answers from last week:

1 Kommentar

Adam Schuyler
Adam Schuyler am 21 Sep. 2011
Thanks for the quick reply Sean de, but I'm using R2009a and R2010a, so the editor API is not available to me. I captured the open m-file list once before (1+ year ago?), so I know it is possible. I really wish I saved the function call...

Melden Sie sich an, um zu kommentieren.

MichaelR
MichaelR am 19 Sep. 2015

0 Stimmen

My suggestion to backup the list of open files on a mac:
- Exit Matlab - Backup from .matlab/R20xxy both MATLABDesktop.xml and MATLABDesktop.xml.prev for instance by copying them to the desktop - Launch Matlab and do your stuff
To revert to the former files copy both files back to .matlab/R20xxy
Rmk: .matlab is hidden under your root directory. It is hidden because one should not tinker with those files :). Rmk: matlab updates the two files regularly, so probably it is a good idea to do the file manipulations with matlab shut down Rmk3: Seems to work for versions since at least R2012b on
Steven Lord
Steven Lord am 5 Dez. 2020

0 Stimmen

This wasn't an option when the question was asked originally, but you may want to create a Project to manage your files.

1 Kommentar

Jim Leveque
Jim Leveque am 13 Sep. 2021
I really like the way that Visual Studio Code handles this, with workspaces that you can load or close. The project idea seems very heavy-handed since it inserts MATLAB too far into the development loop. e.g., source control, which is usually done outside MATLAB.

Melden Sie sich an, um zu kommentieren.

Souarv De
Souarv De am 12 Okt. 2023

0 Stimmen

%parse XML file
xmlFiles = xmlread([prefdir filesep 'MATLAB_Editor_State.xml']);
%Retrieve the "clients"
FileNodes = xmlFiles.getElementsByTagName('File');
%get the length of the FileNodes
nrFiles = FileNodes.getLength;
%initialize Files
Files = cell(nrFiles,1);
%initialize isFile
isFile = zeros(nrFiles,1);
%Iterate over all Elements and check if it is a file.
for iNode = 0:nrFiles-1 % Java indexing.
%Files
Files{iNode+1} = [char(FileNodes.item(iNode).getAttribute('absPath')),...
filesep,char(FileNodes.item(iNode).getAttribute('name'))];
%check if the "client" is a file:
isFile(iNode+1) = exist(Files{iNode+1},'file') == 2 && ~(strcmp(Files{iNode+1},'Workspace'));
end
%remove the other files:
MyFiles = Files(find(isFile));
%open the files in the editor:
edit(MyFiles{:});

Kategorien

Mehr zu Programming finden Sie in Hilfe-Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by