2013-09-26 123 views
3

我有這樣的代碼:在文件夾上循環?

  myFolder='C:\Users\abe7rt\Desktop\dat\1'; 
      filePattern=fullfile(myFolder, '*.txt'); 
      txtFiles=dir(filePattern); 

現在,DAT是一個包含「1,2,3」的文件夾一個文件夾,每個文件夾中包含一個20個TXT文件。 以前的代碼能夠從1個文件夾中獲取txt文件。現在我的問題是:是否有一種方法可以遍歷所有目錄?

回答

3

是有:)

一個很不錯的功能是這一個:

by gnovice: getAllFiles

您可以使用它像這樣:

fileList = getAllFiles('D:\dic'); 

然後,你就必須得擺脫非txt文件,例如通過檢查循環內的擴展!

+0

但在這種情況下,我將無法控制所有數據*太多的數據..我有20個子文件夾? – mecaeng

+0

好吧,這是特別的...你會得到什麼錯誤信息? –

+0

nooo。它真的工作,但我只是在文件夾中的所有txt,所以我不能夠控制這個txt文件。 – mecaeng

2

那麼你可以做類似

for k=1:3 
    myFolder{k}=['C:\Users\abe7rt\Desktop\dat\' num2str(k)]; 
    filePattern{k}=fullfile(myFolder{k}, '*.txt'); 
    txtFiles{k}=dir(filePattern{k}); 
end 

如果性能/內存是一個問題可以很明顯的預分配陣列/單元陣列的尺寸。

+0

我沒有得到如何預分配數組的大小?下標分配尺寸不匹配。 – mecaeng

+0

你會在哪一行得到錯誤信息? – am304

+0

第二個myFolder(k)= ['C:\ Users \ abe7rt \ Desktop \ dat \'num2str(k)]; – mecaeng

1

您可以使用Matlab的函數fileattrib的遞歸版本,然後選擇帶有regexp的txt文件。此解決方案適用於任何數量的文件夾和任何級別的嵌套。

[success,message,messageid] = fileattrib('C:\Users\abe7rt\Desktop\dat\*'); 
[names{1:numel(message)}] = deal(message.Name); 
names_txt = names(~cellfun(@isempty, regexp(names,'\.txt$'))); 

單元陣列names_txt包含所有TXT文件的全名。所以names_txt{n}是一個字符串,其全名爲第n個文件。

確保您將最終的\*添加到根路徑。

4

另一種可能性,使用Apache公共圖書館自帶的MATLAB:

function fileNames = findAllFiles(directory, wildcardPattern) 

    import org.apache.commons.io.filefilter.*; 
    import org.apache.commons.io.FileUtils; 
    import java.io.File; 

    files = FileUtils.listFiles(File(directory),... 
           WildcardFileFilter(wildcardPattern),... 
           FileFilterUtils.trueFileFilter()); 

    fileNames = cellfun(@(f) char(f.getCanonicalPath()),... 
         cell(files.toArray()),... 
         'uniformOutput', false); 
end 

使用例如如:

files = findAllFiles('C:\Users\abe7rt\Desktop\dat', '*.txt') 

如果你想上的目錄,名稱也將一個模式中,搜索應該下降,你可以簡單地更換FileFilterUtils.trueFileFilter()另一個WildcardFileFilter

+0

是否可以使用這個,但在文件夾?比如,是否有可能遍歷文件夾名稱而不是文件?因此,結果將是一個具有指定名稱的文件夾(路徑)列表? –