我需要在文件列表上應用更復雜的邏輯。具體而言,應用軟件更新的時候,我想從更新的zip壓縮文件獲取的文件進行操作如下:爲目錄和子目錄中的每個文件執行一些操作
- 讓
updateFile
從更新歸檔文件,originalFile
當前版本的文件和backupFile
原始文件 的備份
originalFile
如果是相同的當前運行jar
文件,跳過它- 如果
updateFile
的父目錄是特定的名稱,跳過它(例如,與用戶數據目錄)
我寧願像跑步回調每個文件的一些選項:
GreatFileLibrary.forEveryChildOf(new File("my path"),
(File child)->{ ... logic here ... });
如果不是這樣的話,至少只是通過它得到一些Collection
和循環中的所有文件:
Iterable<File> files = GreatFileLibrary.listChildren(new File("my path"));
for(File child:files) {
... logic ...
}
的前者可以讓我顯示進度(感謝列表長度),但我坦率地認爲更新幾乎是即時的。
當然文件可以返回一些兒童名單,所以尤伯杯幼稚的做法是:
/** Returns list of all child files, recursively. **/
public static Iterable<File> listFileChildren(File parent, ArrayList<File> list) {
File[] files = parent.listFiles();
for(File file:files) {
list.add(file);
if(file.isDirectory())
listFileChildren(file, list);
}
return list;
}
public static Iterable<File> listFileChildren(File parent) {
return listFileChildren(parent, new ArrayList());
}
燦內置Java 8庫做的更好?我的快速代碼是否有缺陷?我會真的欣賞刪除將File[]
轉換爲Iterable<File>
作爲我的代碼,這很髒。
我不知道的東西,你想怎麼複雜,做每一個文件,但是這看起來像是從shell腳本來完成,使用'find' –
@ WalterTross雖然在這一刻我作出僅適用於Windows程序,我更喜歡使用跨平臺代碼儘可能。而我從命令行運行的一些函數(獲取UUID進行加密)實際上是有問題的... –
我看到了 - 無論如何,Cygwin是你的朋友 –