文件.复制错误:由于文件系统限制,请求的操作无法完成

本文关键字:操作 请求 错误 复制 文件系统 文件 | 更新日期: 2023-09-27 18:06:24

在结构中获得超过4000000个jpeg文件后,我们遇到了添加新文件的问题。文件。复制抛出异常:由于文件系统限制,请求的操作无法完成。

解决方案吗?

<

信息/strong>

  • System: Windows Server 2008 SP1 x64
  • 安装路径: http://support.microsoft.com/kb/967351/en-us?fr=1
  • 碎片整理:

    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)

文件.复制错误:由于文件系统限制,请求的操作无法完成

您应该分割目录以避免出现问题。Windows不喜欢包含数百万个文件的目录。

为了避免这个问题,我的文件总是用db行ID(这是一个guid)来命名。
然后guid的每个部分都是一个目录,除了最后一个:ID为02510b5a-a605-4a4e-b00a-f554998378a9的文件存储在目录02510b5a/a605/4a4e/b00a/中,名称为f554998378a9。因此,我可以直接使用ID访问文件,并且数百万个文件在许多目录中被分割。

编辑:这是我在这里发表的关于我的解决方案的一个评论:在。net中,Guid的生成使得第一部分经常更改,而最后一部分不那么频繁(或很少)。使用如上所述的拆分会产生很多第一级目录,然后每个子目录中只有1个子目录,等等。所以这仍然会创建很多一级目录,你也可能达到系统限制(我不知道限制在哪里,但Windows肯定不喜欢在同一个目录下有400万个子目录)

解决方案:解决方案是在创建目录时恢复到Guid部分。

示例:对于这个Guid 02510b5a-a605-4a4e-b00a-f554998378a9,您应该使用目录f554998378a9'b00a'4a4e'a605和文件名02510b5a

请注意,. net Guid是使用当前时间生成的,所以如果你在一个循环中创建数百万个Guid,它们看起来都是一样的(只有第一部分会不同),并且使用我的解决方案在同一个目录中结束。