【问题标题】:How to copy xlsx-File without locking it for Excel如何复制 xlsx 文件而不为 Excel 锁定它
【发布时间】:2014-03-18 19:08:45
【问题描述】:

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

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

【问题讨论】:

    标签: c# excel copy


    【解决方案1】:

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

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

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

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

    编辑:是的,你有!

    查看这个答案:Beginner Python: Saving an excel file while it is open

    它解决了同样的问题(而且似乎没有很好的解决方法)

    您可以将锁定的文件放入一个列表中并返回它们。没有理由不能处理异常,将文件放入队列,继续处理其他文件,并在完成其余文件后重新开始(有延迟)。

    至少这样,在您重新访问时用户可能已经完成了文件

    【讨论】:

    • 谢谢,但问题不是 excel 锁定文件,问题是我的程序在读取时锁定了 excel 文件,因此 Excel 无法保存它。据我了解,这不应该发生,因为我只是在使用 FileShare.ReadWrite 阅读。我无法实现重试,因为我无法控制的用户/宏需要重试。我想防止这种情况发生。
    • 有人建议他们以这种方式工作:stackoverflow.com/questions/2730565/… - 但看起来您已经在使用这种方法 FileShare.ReadWrite
    • Jup,这就是我想知道的 - Excel 2010 似乎在共享模式下读取文件时阻止保存文件,根据 MSDN“允许随后打开文件以进行读取或写入”。它确实 - 对于记事本,但不适用于 Excel(读取工作正常,但不能保存),Excel 似乎进行了一些额外的检查,至少在 Excel 2010 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多