我將包含數千個文件的一個文件夾從我的電腦複製到手機。由於某些干擾,某些文件未被複制。但文件夾大小接近1 GB。在複製和粘貼時,找到丟失的文件和子目錄及其文件列表?
所以我檢查文件夾大小兩個文件夾(來源以及目的地)只有一些kb的大小差異。如果我再次複製這意味着它需要一些時間,我需要覆蓋現有的文件。
而不是我需要列出什麼是缺少的文件,然後只複製丟失的文件。我可以爲此製作一個簡單的exe工具嗎?如何找到丟失的文件可以讓任何人提供一些指導。如果您覺得這是愚蠢的問題,請不要誤會我。
我將包含數千個文件的一個文件夾從我的電腦複製到手機。由於某些干擾,某些文件未被複制。但文件夾大小接近1 GB。在複製和粘貼時,找到丟失的文件和子目錄及其文件列表?
所以我檢查文件夾大小兩個文件夾(來源以及目的地)只有一些kb的大小差異。如果我再次複製這意味着它需要一些時間,我需要覆蓋現有的文件。
而不是我需要列出什麼是缺少的文件,然後只複製丟失的文件。我可以爲此製作一個簡單的exe工具嗎?如何找到丟失的文件可以讓任何人提供一些指導。如果您覺得這是愚蠢的問題,請不要誤會我。
我可以爲此做一個簡單的exe工具。
當然。
如何找到丟失的文件可以給任何一個指南做。
您需要兩個列表。您需要閱讀並填寫一個,然後閱讀並比較以確定缺少的內容。該代碼可能是這個樣子:
var targetFiles = new List<string>();
foreach (var f in Directory.GetFiles(targetDir))
{
targetFiles.Add(Path.GetFileName(f));
}
var missingFiles = new List<string>();
foreach (var f in Directory.GetFiles(sourceDir))
{
if (targetFiles.Contains(Path.GetFileName(f))) { continue; }
missingFiles.Add(Path.GetFileName(f));
}
現在所有目標丟失的文件都在missingFiles
列表。然後,您可以遍歷該列表以將這些缺失的文件複製到目標。代碼
邁克爾 - 我認爲你的代碼是錯誤的。如果'sourceDir'最初被複制到'targetDir',那麼'sourceFiles.Contains(Path.GetFileName(f))'將永遠*爲真 - 我認爲你實際上想要構建'targetDir'中所有文件的列表首先,然後在你的第二個循環中檢查if(targetFiles.Contains ...)(當然,我注意到這個* *之後我把upvoted給你:-)我將離開upvote到位!) –
@DanPuzey ,你是100%的權利。我需要另一杯咖啡!我會編輯,非常感謝。 –
沒問題 - 我完全瞭解不喝足夠咖啡的危險! –
強制性LINQ版本檢索您需要複製的文件列表:
var srcFiles = Directory.GetFiles(sourceDir).Select(f => Path.GetFileName(f));
var destFiles = Directory.GetFiles(destinationDir).Select(f => Path.GetFileName(f));
var filesToCopy = src.Except(dest);
一個警告(既這個答案和邁克爾的)是一個嵌套的目錄結構將不支持 - 如果你有子文件夾也被複制,這段代碼將不起作用。
編輯包括來自用於嵌套子目錄的註釋代碼...
var srcFiles = Directory.GetFiles(sourceDir,"*.*", System.IO.SearchOption.AllDirectories).Select(f => Path.GetFullPath(f).SubString(sourceDir.Length));
var destFiles = Directory.GetFiles(sourceDir,"*.*", System.IO.SearchOption.AllDirectories).Select(f => Path.GetFullPath(f).SubString(sourceDir.Length));
var filesToCopy = src.Except(dest);
var fullPathOfFilesToCopy = src.Except(dest).Select(s => Path.Combine(sourceDir, s));
+1爲LINQ提供了一個不錯的優雅解決方案。 –
有一個[Directory.GetFiles'重載](http://msdn.microsoft.com/en-us/library/ms143316.aspx)是遞歸:'Directort.GetFiles(sourceDir,「*。*」 'System.IO.SearchOption。所有目錄)' –
@SteveB如果他使用遞歸搜索,他需要'Path.GetFullPath'來避免名稱衝突,因爲'Path.GetFileName'只返回文件名+擴展部分(即'C:\ a.txt'和' C:\ folder \ a.txt'都是'a.txt') –
你嘗試過什麼碼? – ChrisBint
http://stackoverflow.com/questions/4374887/how-to-compare-two-folders-for-similar-files-based-on-name-in-c – Ofiris
也許你可以['robocopy.exe']( http://technet.microsoft.com/library/cc733145.aspx)。這個小而簡單的工具是必須具備的,可以解決大量問題。我甚至在一些項目中看到了C#代碼中的這些工具與自制的複製解決方案,因爲它非常強大且易於使用。 –