仅在复制/粘贴时锁定文件,而不是在剪切/粘贴时锁定

Posted

技术标签:

【中文标题】仅在复制/粘贴时锁定文件,而不是在剪切/粘贴时锁定【英文标题】:File locked only if copy/paste, not if cut/paste 【发布时间】:2013-10-16 14:24:15 【问题描述】:

我正在监视一个文件夹中的新文件,当新文件出现时,我读取(并保存在 txt 中)文件如下:

FileStream file = File.Open(this.filePath, FileMode.Open, FileAccess.Read);
StreamReader reader = new System.IO.StreamReader(file);
string text = reader.ReadToEnd();
reader.Close();

如果我将源文件复制/粘贴到文件夹中,我会收到一个 IOExcpetion,告诉我该文件已被另一个进程使用。 如果我在文件夹中剪切/粘贴,一切正常。 此外,如果我将文件从另一台机器复制(但在这种情况下也剪切)/粘贴到受监控的文件夹中,也会发生锁定问题。

你知道发生了什么吗?

有没有更安全的方法来访问文件以避免这种类型的锁定?

谢谢!

【问题讨论】:

你如何监控文件夹..向我们展示代码..你在使用 FileSystemWatcher 吗? 我正在使用 FileSystemWatcher(在一个包装类中以监控多个文件夹) 很可能与您的FileSystemWatcher 有冲突!给我们看代码 当然!我使用了这个代码:codeproject.com/Articles/271669/… 我会说从另一台机器上它只是更多,因为文件完成它需要时间并且复制过程持有文件人质。使用文件添加逻辑以确保在执行任何处理之前完全可以访问文件时,这是一种很好的做法。 FileSystem 对文件的访问速度非常快,因此您的流程逻辑会立即启动,因此您要确保它没有被锁定。 【参考方案1】:

这是我做的一个小 sn-p 操作,以确保文件已完成复制或未被另一个进程使用。

 private bool FileUploadCompleted(string filename)
    
        try
        
            using (FileStream inputStream = File.Open(filename, FileMode.Open,
                FileAccess.Read,
                FileShare.None))
            
                return true;
            
        
        catch (IOException)
        
            return false;
        
    

然后你可以在你的流程逻辑之前实现它

while (!FileUploadCompleted(filePath))

    //if the file is in use it will enter here
    //So you could sleep the thread here for a second or something to allow it some time
    // Also you could add a retry count and if it goes past the allotted retries you
    // can break the loop and send an email or log the file for manual processing or
    // something like that


【讨论】:

以上是关于仅在复制/粘贴时锁定文件,而不是在剪切/粘贴时锁定的主要内容,如果未能解决你的问题,请参考以下文章

VBA:复制/粘贴新工作表,包括锁定单元格

access文件共享锁定数溢出怎么办

文档可修改,但不能复制粘贴,怎么办?

是否有通过 Windows 资源管理器以编程方式剪切/复制/粘贴文件的 Windows API?

Linux命令 复制粘贴剪切

vim在系统剪切板的复制与粘贴