如何复制xlsx-File而不锁定Excel

时间:2014-03-18 10:27:24

标签: c# excel copy

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

当我在读取时更改记事本中的文件时,这可以正常工作。但是当我尝试在Excel 2010中保存文件时,我收到消息" {FileName}当前正在使用中。稍后再试。"

我尝试使用.NET Framework 3.5和.NET Framework 4.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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

我认为无法以只读模式打开电子表格或创建副本。

如果你需要复制,我认为你不需要锁定文件(我确定你可以打开只读)

您是否尝试过更改您的阅读权限?

编辑:啊,是的,你有!

检查此答案:Beginner Python: Saving an excel file while it is open

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

您可以将锁定的文件放入列表中并返回给他们。没有理由你无法处理异常,将文件放入队列,继续使用其他文件并在完成其余文件后再次回到起点(延迟)。

至少这样,当你再次访问时,用户可能已经完成了文件