在不使用 windows 文件缓存的情况下复制文件

     2023-04-13     240

关键词:

【中文标题】在不使用 windows 文件缓存的情况下复制文件【英文标题】:Copy a file without using the windows file cache 【发布时间】:2010-09-08 02:24:31 【问题描述】:

有人知道将文件从路径 A 复制到路径 B 并抑制 Windows 文件系统缓存的方法吗? 典型用途是将大文件从 USB 驱动器或服务器复制到本地计算机。如果文件真的很大,Windows 似乎会交换所有内容,例如2GiB。 更喜欢 C# 中的示例,但我猜如果可能的话,这将是某种 Win32 调用。

【问题讨论】:

如果你真的想了解缓存与文件复制交互的机制,this is a must read. 【参考方案1】:

在 C# 中我发现类似这样的工作,可以将其更改为直接复制到目标文件:

    public static byte[] ReadAllBytesUnbuffered(string filePath)
    
        const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
        var fileInfo = new FileInfo(filePath);
        long fileLength = fileInfo.Length;
        int bufferSize = (int)Math.Min(fileLength, int.MaxValue / 2);
        bufferSize += ((bufferSize + 1023) & ~1023) - bufferSize;
        using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None,
                                           bufferSize, FileFlagNoBuffering | FileOptions.SequentialScan))
        
            long length = stream.Length;
            if (length > 0x7fffffffL)
            
                throw new IOException("File too long over 2GB");
            
            int offset = 0;
            int count = (int)length;
            var buffer = new byte[count];
            while (count > 0)
            
                int bytesRead = stream.Read(buffer, offset, count);
                if (bytesRead == 0)
                
                    throw new EndOfStreamException("Read beyond end of file EOF");
                
                offset += bytesRead;
                count -= bytesRead;
            
            return buffer;
        
    

【讨论】:

【参考方案2】:

更重要的是,还有 FILE_FLAG_WRITE_THROUGH 和 FILE_FLAG_NO_BUFFERING。

MSDN 有一篇关于它们的好文章:http://support.microsoft.com/kb/99794

【讨论】:

这个答案虽然正确,但并不是对原始问题的答案。有编辑权限的人可以改写吗? 您能告诉我您在哪里看到 Q 和 A 之间的差异吗?我很乐意改写答案。 @gabr:您的回复引用(“更重要”)另一个答案。别。让你的答案独立。认为只有你回答,没有其他人。【参考方案3】:

我不确定这是否有帮助,但请查看 Increased Performance Using FILE_FLAG_SEQUENTIAL_SCAN。

总结

CreateFile() 有一个标志 称为 FILE_FLAG_SEQUENTIAL_SCAN 其中 将指示缓存管理器 按顺序访问文件。

任何阅读潜在大文件的人 使用顺序访问可以指定 此标志用于提高性能。 如果您正在阅读,此标志很有用 “大部分”顺序的文件, 但你偶尔会跳过小的 字节范围。

【讨论】:

我将此标志用于相同目的,并且我可以证明 FILE_FLAG_SEQUENTIAL_SCAN 正在完成这项工作。【参考方案4】:

如果您不介意使用工具,ESEUTIL 对我来说非常有用。

您可以查看此blog 条目,比较缓冲和非缓冲 IO 函数以及从何处获取 ESEUTIL。

从 technet 博客复制一些文本:

所以看看上面缓冲 I/O 的定义,我们可以看到感知到的性能问题在哪里——文件系统缓存开销。当我们不打算在复制完成后访问源文件时,尝试将大文件从一个位置复制到另一个位置时,首选无缓冲 I/O(或原始文件副本)。这将避免文件系统缓存开销,并防止文件系统缓存被大文件数据有效刷新。许多应用程序通过调用 CreateFile() 来创建一个空的目标文件,然后使用 ReadFile() 和 WriteFile() 函数来传输数据来实现这一点。 CreateFile() - CreateFile 函数创建或打开文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、邮槽或命名管道。该函数返回可用于访问对象的句柄。 ReadFile() - ReadFile 函数从文件中读取数据,并从文件指针指示的位置开始。您可以将此函数用于同步和异步操作。 WriteFile() - WriteFile 函数将数据写入文件指针指定位置的文件。此函数设计用于同步和异步操作。 对于在网络上复制非常大的文件,我选择的复制实用程序是 ESEUTIL,它是 Exchange 提供的数据库实用程序之一。

【讨论】:

【参考方案5】:

Eseutil 是正确答案,从 Win7 / 2008 R2 开始也可以使用 Xcopy 中的 /j 开关,效果相同。

【讨论】:

【参考方案6】:

我知道这个问题是 11 年前的问题,现在有 robocopy 可以替代 xcopy。

你需要检查 /J 选项 /J :: copy using unbuffered I/O (recommended for large files)

【讨论】:

ccache 在不删除 CMake 文件的情况下不会命中缓存

】ccache在不删除CMake文件的情况下不会命中缓存【英文标题】:ccachedoesnothitcachewithoutdeletingCMakefiles【发布时间】:2010-05-2815:54:00【问题描述】:我正在尝试将ccache与CMake一起使用。我在/usr/local/bin中放置了名为gcc、g++和c++的符号... 查看详情

如何在不接触该目录中的文件的情况下查找文件夹更改(使用 Windows 和 C++)

】如何在不接触该目录中的文件的情况下查找文件夹更改(使用Windows和C++)【英文标题】:Howtofindfolderchangeswithouttouchingthefilesinthatdirectory(UsingWindowsandC++)【发布时间】:2014-07-3108:54:58【问题描述】:好吧,我对此感到困惑,我有... 查看详情

是否可以在不创建全新文件的情况下修改 .jar 文件? [复制]

】是否可以在不创建全新文件的情况下修改.jar文件?[复制]【英文标题】:Isitpossibletomodifya.jarfilewithoutcreateawholenewone?[duplicate]【发布时间】:2015-03-0423:29:03【问题描述】:我正在开发一个Java应用程序。本质上,它会选择一个.jar... 查看详情

如何在不使用库的情况下将默认名称“选择文件”更改为“选择文档”? [复制]

】如何在不使用库的情况下将默认名称“选择文件”更改为“选择文档”?[复制]【英文标题】:HowcanIchangethedefaultname"Selectfile"to"Selectdocument"withoutusinglibraries?[duplicate]【发布时间】:2021-09-1616:11:01【问题描述】:... 查看详情

如何在不覆盖 Go 中现有文件的情况下复制文件?

】如何在不覆盖Go中现有文件的情况下复制文件?【英文标题】:HowdoIcopyafilewithoutoverwritinganexistingfileinGo?【发布时间】:2021-11-2709:46:15【问题描述】:如果文件存在,如何创建具有给定名称的新文件例如:如果word_destination.txt存... 查看详情

是否可以在不运行 QEMU 的情况下将文件复制到 QEMU 映像?

】是否可以在不运行QEMU的情况下将文件复制到QEMU映像?【英文标题】:IsitpossibletocopyfilestoQEMUimagewithoutrunningQEMU?【发布时间】:2022-01-1721:43:03【问题描述】:我正在使用QEMU运行CI。在我开始运行测试之前,我通过运行将文件复... 查看详情

如何在不使用重命名命令的情况下递归搜索目录并从文件名中删除开/关括号? [复制]

】如何在不使用重命名命令的情况下递归搜索目录并从文件名中删除开/关括号?[复制]【英文标题】:HowdoIrecursivelysearchthroughdirectoriesandremoveopen/closebracketsfromfilenameswithoutusingtherenamecommand?[duplicate]【发布时间】:2021-05-2907:28:28【... 查看详情

如何在不从磁盘中删除文件的情况下 git rm 文件? [复制]

】如何在不从磁盘中删除文件的情况下gitrm文件?[复制]【英文标题】:HowdoIgitrmafilewithoutdeletingitfromdisk?[duplicate]【发布时间】:2010-11-1909:00:59【问题描述】:该命令删除我系统中的文件。我的意思是只从Git存储库中删除文件。如... 查看详情

如何在不需要 .jar 之外的文件的情况下保存字符串? [复制]

】如何在不需要.jar之外的文件的情况下保存字符串?[复制]【英文标题】:HowcanIsaveaStringwithoutneedingafileoutsidethe.jar?[duplicate]【发布时间】:2016-05-0521:25:28【问题描述】:我目前正在创建密码安全类型的应用程序,但我在登录时卡... 查看详情

vscode中有没有办法在不保存文件的情况下启用语法突出显示? [复制]

】vscode中有没有办法在不保存文件的情况下启用语法突出显示?[复制]【英文标题】:Isthereawayinvscodetoenablesyntaxhighlightingwithoutsavingthefile?[duplicate]【发布时间】:2018-01-2708:38:20【问题描述】:Notepad++有一个语言菜单,我们可以使... 查看详情

如何在不覆盖当前内容的情况下写入文件? [复制]

】如何在不覆盖当前内容的情况下写入文件?[复制]【英文标题】:Howtowritetoafilewithoutoverwritingcurrentcontents?[duplicate]【发布时间】:2014-04-2122:00:03【问题描述】:withopen("games.txt","w")astext_file:print(driver.current_url)text_file.write(driver.curr... 查看详情

在不使用 pip 的情况下安装 python wheel 文件

】在不使用pip的情况下安装pythonwheel文件【英文标题】:Installpythonwheelfilewithoutusingpip【发布时间】:2016-07-0800:56:33【问题描述】:是否可以不使用pip来安装Python***?我总是在使用pip安装时遇到问题,所以我通常通过复制和粘贴来... 查看详情

如何在不覆盖之前数据的情况下创建多个 java txt 文件? [复制]

】如何在不覆盖之前数据的情况下创建多个javatxt文件?[复制]【英文标题】:Howtocreatemultiplejavatxtfileswithoutoverridingthepreviousdata?[duplicate]【发布时间】:2012-06-1820:37:29【问题描述】:可能重复:Writingtoafilewithoutoverwritingorappending您... 查看详情

如何在不重新启动的情况下卸载 Windows 服务并删除其文件

】如何在不重新启动的情况下卸载Windows服务并删除其文件【英文标题】:Howtouninstallawindowsserviceanddeleteitsfileswithoutrebooting【发布时间】:2010-09-2221:53:08【问题描述】:我当前的项目涉及部署作为Windows服务运行的升级.exe文件。为... 查看详情

如何允许表单在不处理 Windows 消息的情况下接受文件删除?

】如何允许表单在不处理Windows消息的情况下接受文件删除?【英文标题】:HowcanIallowaformtoacceptfiledroppingwithouthandlingWindowsmessages?【发布时间】:2011-05-2005:42:50【问题描述】:在DelphiXE中,我可以让我的表单接受文件“拖放”但不... 查看详情

如何在不使用复制命令的情况下使用 AWS Glue 将 s3 存储桶上的 csv 文件中的数据导入/加载到 Redshift

】如何在不使用复制命令的情况下使用AWSGlue将s3存储桶上的csv文件中的数据导入/加载到Redshift【英文标题】:Howtoimport/loaddatafromcsvfilesons3bucketintoRedshiftusingAWSGluewithoutusingcopycommand【发布时间】:2021-04-0818:13:02【问题描述】:具有... 查看详情

如何在不使用 3rd-party API 的情况下用 C# 压缩文件?

】如何在不使用3rd-partyAPI的情况下用C#压缩文件?【英文标题】:HowdoIZIPafileinC#,usingno3rd-partyAPIs?【发布时间】:2010-10-3017:56:16【问题描述】:我很确定这不是重复的,所以请耐心等待一分钟。如何在不使用任何第三方库的情况下... 查看详情

在不使用库的情况下播放 MP3/WAV 文件?

】在不使用库的情况下播放MP3/WAV文件?【英文标题】:PlayMP3/WAVfileswithoutusinglibraries?【发布时间】:2017-07-2704:05:14【问题描述】:我正在使用一个名为Eclipse(OxygenRelease(4.7.0))的应用程序,并且在MacOSSierra上使用它。几天前,我... 查看详情