Create Text file containing list of file names

I am sure this has been answered before somewhere, but I am getting really frustrated trying to find the correct code.
I have over 400 files in a directory. I would like to create a text file that lists all of their file names. Then place this text file into the directory with the original files, not the matlab working directory. I have to do this well over 100 times for 100 different directories.
The only code that has worked partially is this:
dirName = 'D:\ABN tdump files\ERA -I 10m\April 10m'; %# folder path
files = dir( fullfile(dirName,'*.') ); %# list all *.xyz files
files = {files.name}'; %'# file names
I have created a cell with all of my file names, but now I can't create the text file. I get the very ambiguous error message that just says there is an error with one of my lines of code. Not helpful. So. Question. How does one create a text file with a cell array?

8 Comments

I was able to canabalize another code and managed to write the file, but now I am stuck with another problem. Here is the code for the writing.
dirName = 'D:\ABN tdump files\ERA -I 10m\April 10m'; %# folder path
files = dir( fullfile(dirName,'.') ); %# list all *.xyz files
files = {files.name}'; %'# file names
[fid,msg] = fopen(sprintf('INFILE'),'wt');
assert(fid>=3,msg)
fprintf(fid,'%s\n',files{:});
fclose(fid);
When the file is written, the first two rows contain 1 or two periods. It is in the cell array called files also. Not sure where it comes from. Is there a way to not have these rows included in the text file or remove them from the cell?
"an error with one of my lines of code" Full error message, please!
If the directory has folders (subdirectories) do you want the names of them to be excluded from the list? Do you want the list of all of the files (but not directories) to any level of depth? Or just non-directories that are directly in the current directory?
files([files.isdir]) = []; %removes ., .. and all folders
"for 100 different directories" How to find the names of those directories?
That is a good question. The directories are listed by month and height, such that April 10m is all files relating to April at 10m. May at 10m is listed as 'D:\ABN tdump files\ERA -I 10m\May 10m' . The other months follow suit.
Thank you Walter Roberson. Works Great.
files([files.isdir]) = []; %removes ., .. and all folders
This also worked.
files = dir(fullfile(dirName,'name*') );
This is for all that need to know how to create a lot of files and then have them move to a certain location. This code works a charm. I created an excel file with all of the directory paths, "FileDirectory". I then imported the list as a string.
for q = 1:144 %This number is linked to the number of cells that have filepaths. Pathnames in FileDirectory.xls.
filedirectory = FileDirectory{q,1};
dirName = filedirectory; %'D:\ABN_tdump_files\10_day_Traj\ERA-I_2500m\April2500m\'; %# folder path
files = dir(fullfile(dirName,'fdump*') ); %# list all *.xyz files
files = {files.name}; %'# file names
[fid,msg] = fopen(sprintf('INFILE'),'wt');
assert(fid>=0,msg)
fprintf(fid,'%s\n',files{:});
fclose(fid);
movefile ('C:\Users\cglor\Documents\HYSPLIT\INFILE', dirName)
end

Sign in to comment.

 Accepted Answer

Stephen23
Stephen23 on 14 Apr 2018
Edited: Stephen23 on 14 Apr 2018
Simpler:
D = 'D:\ABN tdump files\ERA -I 10m\April 10m';
S = dir(fullfile(D,'*.xyz')); % specify the file extension to exclude directories
[fid,msg] = fopen(fullfile(D,'text.txt'));
assert(fid>=3,msg)
fprintf(fid,'%s\n',S.name)
fclose(fid);
Repeat for each directory D.

More Answers (1)

Almost there. Add these lines to the bottom and it should work:
files(1:2) = []; % get rid of . and ..
fileID = fopen(fullfile(dirName,'list.txt'),'w'); % create and open file
cellfun(@(x) fprintf(fileID,'%s \n',x), files) % write file

4 Comments

You should never rely on . and .. being the first two entries in the directory. It is not true on the NTFS file system or FAT file system, or on any of the Apple file systems, or on the more common Linux file systems that I have encountered. Basically it hasn't been true since the days of SVS2 (UNIX System 5 Version 2)
Ah, good to now this. I have never seen them not be the first two, but my breadth in operating systems (or file systems) is lacking.
Ah there it is:
>> dir('*')
!test.txt . .. A1.tiff A2.tiff
Welp... gotta go do some changes in old codes now...
I have been unable to find any documentation promising any particular directory order for NTFS. In practice the order has always been sorted by Unicode when I have tested. (Though I have not checked if it is utf8 or utf16-le or something else).
It is not uncommon these days for filesystems to sort the first block of a directory whenever a change is made to the block, but filesystems differ in whether they keep all of the blocks of one directory sorted, since doing so can result in unnecessary disk i/o. Filesystems have also differed about whether to sort alphabetically (allowing binary search on names) or sorting to have the most commonly used entries first.

Sign in to comment.

Asked:

C G
on 14 Apr 2018

Commented:

C G
on 30 Apr 2018

Community Treasure Hunt

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

Start Hunting!