C# 如何在Excel中复制xlsx文件而不锁定它

C# 如何在Excel中复制xlsx文件而不锁定它,c#,excel,copy,C#,Excel,Copy,我目前正在尝试编写一种方法,在不阻止其他应用程序更改文件的情况下复制文件。如果在阅读时有变化,我会再看一遍 在读取记事本中的文件时,如果我更改了这些文件,则效果很好。但是,当我尝试在Excel 2010中保存该文件时,会收到消息“{FileName}当前正在使用中。请稍后再试。” 我使用.NETFramework3.5和.NETFramework4.0进行了尝试 int partsToReadAtOnce = 5 * 1024 * 1024; bool fileChangedDuringWrit

我目前正在尝试编写一种方法,在不阻止其他应用程序更改文件的情况下复制文件。如果在阅读时有变化,我会再看一遍

在读取记事本中的文件时,如果我更改了这些文件,则效果很好。但是,当我尝试在Excel 2010中保存该文件时,会收到消息“{FileName}当前正在使用中。请稍后再试。”

我使用.NETFramework3.5和.NETFramework4.0进行了尝试

int partsToReadAtOnce = 5 * 1024 * 1024;
bool fileChangedDuringWrite = false;
using (FileStream readStr = new FileStream(srcPath, FileMode.Open, FileAccess.Read,FileShare.ReadWrite))
{
    using (FileStream writeStr = new FileStream(targetPath, FileMode.Create, FileAccess.Write,FileShare.None))
    {
        do
        {
            DateTime srcWriteTimeBefore = new FileInfo(srcPath).LastWriteTime;
            writeStr.SetLength(0);
            readStr.Seek(0, SeekOrigin.Begin);
            byte[] curData = new byte[partsToReadAtOnce];
            int len = 1;
            while ((len = readStr.Read(curData, 0, partsToReadAtOnce)) != 0)
            {
                writeStr.Write(curData, 0, len);
            }

            // break here and try to write to the file
            FileInfo srcInfo = new FileInfo(srcPath);
            FileInfo targetInfo = new FileInfo(targetPath);
            fileChangedDuringWrite = srcInfo.LastWriteTime.Ticks != srcWriteTimeBefore.Ticks
                || srcInfo.Length != targetInfo.Length;
        } while (fileChangedDuringWrite);
    }
}

简单的回答是,记事本不会锁定文件(它会将文件读入内存,然后编辑内存中的版本),而Excel会锁定文件

我认为除了以只读模式打开电子表格或创建副本之外,没有其他方法

如果您需要复制,我认为您不需要锁定文件(我相信您可以以只读方式打开)

您是否尝试过将访问权限更改为读取

编辑:啊,是的,你有

请查看以下答案:

它解决了同样的问题(而且似乎没有一个好的解决办法)

您可以将锁定的文件放入列表中,然后返回。没有理由不能处理异常、将文件放入队列、继续处理其他文件,并在处理完其余文件后(延迟)再次返回开始


至少通过这种方式,用户有可能在您重新访问时已完成文件处理

谢谢,但问题不是excel锁定文件,而是我的程序在读取excel文件时锁定了它,因此excel无法保存它。在我看来,这不应该发生,因为我只是在阅读FileShare.ReadWrite。我无法实现重试,因为我无法控制的用户/宏需要重试。我想防止这种情况发生。有人在这里建议,他们是以这种方式工作的:-但看起来您已经在
FileShare.ReadWrite
Jup中使用了这种方法,这就是我想知道的-Excel 2010似乎会阻止在共享模式下读取文件时保存该文件,根据MSDN的说法是什么“允许随后打开文件进行读取或写入”。确实如此——对于记事本,但对于Excel(读取工作正常,但不保存),Excel似乎进行了一些额外的检查,至少在Excel 2010中是这样。