2013-03-28 103 views
6

在獲得結構中超過4000000個jpeg文件後,我們遇到添加新問題的問題。 File.Copy拋出異常:由於文件系統限制,請求的操作無法完成。File.Copy錯誤:由於文件系統限制,請求的操作無法完成

任何解決方案?

信息

代碼

public bool AddFile(Uri uri, string path, bool withDelete = false) 
    { 
     var sourceFilePath = path; 
     var destinationFilePath = Path.GetFullPath(uri.LocalPath); 

     try 
     { 
      if (!File.Exists(sourceFilePath)) 
      { 
       sourceFilePath = Directory.EnumerateFiles(sourceFilePath).FirstOrDefault(); 
       destinationFilePath = Path.Combine(destinationFilePath, Path.GetFileName(sourceFilePath)); 
      } 

      if (!Directory.Exists(Path.GetDirectoryName(destinationFilePath))) 
       Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath)); 

      if (withDelete && File.Exists(destinationFilePath)) 
       File.Delete(destinationFilePath); 

      File.Copy(sourceFilePath, destinationFilePath); 

      return true; 
     } 
     catch (Exception exc) 
     { 
      ServiceCore.GetLogger().Error(exc); 
      throw exc; 
     } 
    } 

堆棧跟蹤

2013-03-28 14:10:48.3784[Info]: 47356388:Unive.NetService.SimpleServices.DocumentManagementSerivce..ctor: Entry 
    2013-03-28 14:10:48.4740[Info]: Static:Unive.NetService.SimpleServices.DocumentManagementSerivce..ctor: Success 
    2013-03-28 14:10:48.4899[Info]: 47356388:Unive.NetService.SimpleServices.DocumentManagementSerivce.UploadFile: Entry 
    2013-03-28 14:11:26.3277[Error]: Exception 
    Message:The requested operation could not be completed due to a file system limitation 

    Source:mscorlib 
    Stack Trace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
     at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite) 
     at Unive.NetService.Business.SimpleFileClient.AddFile(Uri uri, String path, Boolean withDelete) in D:\Tag Prografix\Unive.NetService\Business\SimpleFileClient.cs:line 33 
    TargetSite:Void WinIOError(Int32, System.String) 
    2013-03-28 14:11:26.5029[Error]:       47356388:Unive.NetService.SimpleServices.DocumentManagementSerivce.UploadFileException 
    Message:The requested operation could not be completed due to a file system limitation 

    Source:mscorlib 
    Stack Trace: at Unive.NetService.Business.SimpleFileClient.AddFile(Uri uri, String path, Boolean withDelete) in D:\Tag Prografix\Unive.NetService\Business\SimpleFileClient.cs:line 42 
     at Unive.NetService.Business.FileService.UploadFile(Int64 fileId, String fileName, String path, Boolean isDiagram) in D:\Tag Prografix\Unive.NetService\Business\FileService.cs:line 80 
     at Unive.NetService.SimpleServices.DocumentManagementSerivce.UploadFile(Int64 fileId, String fileName, String path) in D:\Tag Prografix\Unive.NetService\SimpleServices\DocumentManagementSerivce.asmx.cs:line 100 
    TargetSite:Void WinIOError(Int32, System.String) 
+0

這是一種可能性:http://blogs.technet.com/b/seanearp/archive/2011/07/06/file-system-limitation.aspx –

+9

http://stackoverflow.com/questions/197162/ ntfs-performance-and-large-volumes-of-files-and-directories/291292#291292(_「然後或者」_是給你的) –

回答

2

你應該分裂,分裂目錄以避免出現問題。 Windows不喜歡擁有數百萬個文件的目錄。

爲了避免這個問題,我的文件總是以db行ID(這是一個guid)命名。
然後guid的每個部分都是一個目錄,除了最後一個:ID爲02510b5a-a605-4a4e-b00a-f554998378a9的文件存儲在目錄02510b5a/a605/4a4e/b00a /中,名稱爲f554998378a9。因此,我可以直接使用ID來訪問文件,並且數百萬個文件被分割到很多目錄中。

編輯: 只是我注意到我的解決方案,因爲我張貼在這裏:.NET Guid生成,以便第一部分經常更改,最後一部分並不經常(或很少)。如上所述使用分割會導致很多第一級目錄,然後每個子目錄中只有一個子目錄等等。所以這仍然會創建很多第一級目錄,您也可以達到系統限制(我不知道在哪裏的限制,但Windows肯定不會在同一目錄中擁有4 000 000個子目錄)

解決方案:解決方案是在創建目錄時恢復爲Guid部件。

示例:此GUID 02510b5a-a605-4a4e-b00a-f554998378a9你應該使用目錄f554998378a9\b00a\4a4e\a605和文件名02510b5a

要知道,.NET的Guid正在使用當前時間產生的,所以如果你在一個循環中創造數以百萬計的Guid,他們將所有的外觀像相同(只是第一部分會有所不同),並使用我的解決方案結束在同一個目錄中。

+0

我編輯了我的解決方案, – Fabske

相關問題