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

本文关键字:锁定 Excel xlsx-File 何复制 复制 | 更新日期: 2023-09-27 17:50:49

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

当我在记事本中更改文件时,它可以正常工作。但是当我试图在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);
    }
}

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

简单的回答是,记事本不锁定文件(它读取文件到内存中,你编辑内存中的版本),而Excel锁定文件

我认为没有办法避免以只读模式打开电子表格或创建副本。

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

您是否尝试将访问权限更改为read?

编辑:啊,是的,你有!

看看这个答案:初学者Python:保存excel文件时,它是打开的

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

你可以把被锁定的文件放到一个列表中,然后再回来看它们。没有理由不能处理异常,将文件放入队列,继续处理其他文件,并在完成其余文件后(有延迟)再次返回开始。

至少这样,当您重新访问

时,用户有可能已经完成了文件