gpt4 book ai didi

c# - FileSystemWatcher 无法访问文件,因为已在其他进程中使用

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:55 25 4
gpt4 key购买 nike

我正在编写一个 FileSystemWatcher,它将图像从文件夹 A 复制到文件夹 B,无论何时将图像上传到文件夹 A。我试图将其用作服务器 PC 上的 Windows 服务,但我有我的文件在复制时被锁定的一些问题。我想我已经找到问题的根源,但我没有运气解决它。因此,当我运行我的 Windows 服务时,它总是在第一张或第二张图片上传时意外结束。我收到的错误消息是这样说的:进程无法访问文件“文件路径”,因为它正被另一个进程使用。

我的代码的相关部分:

public void WatchForChanges()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = Program.SourceFolder;
watcher.Created += new FileSystemEventHandler(OnImageAdded);
watcher.EnableRaisingEvents = true;
watcher.IncludeSubdirectories = true;
}

public void OnImageAdded(object source, FileSystemEventArgs e)
{
FileInfo file = new FileInfo(e.FullPath);
ImageHandler handler = new ImageHandler();
if (handler.IsImage(file))
{
handler.CopyImage(file);
}
}

以及我的 CopyImage 方法,其中包括我针对此问题提出的解决方案之一,它利用 while 循环捕获错误并重试图像的复制:

public void CopyImage(FileSystemInfo file)
{
// code that sets folder paths
// code that sets folder paths

bool retry = true;
if (!Directory.Exists(targetFolderPath))
{
Directory.CreateDirectory(targetFolderPath);
}
while (retry)
{
try
{
File.Copy(file.FullName, targetPath, true);
retry = false;
}
catch (Exception e)
{
Thread.Sleep(2000);
}
}
}

但是这个 CopyImage 解决方案只是不断地复制同一个文件,这对我来说不是很理想。我希望这已经足够了,但遗憾的是我有一排图像在等待。

最佳答案

图像文件可能是由另一个应用程序创建的,该应用程序在读取和写入外部进程时使用独占访问锁(有关更多信息,请阅读 this ,尤其是与 Microsoft Windows 相关的段落)。您必须:

  • 停止/杀死正在使用该文件的进程;
  • 等到文件不再被使用。

由于其他进程可能在您尝试使用应用程序复制文件时正在写入文件,因此绝不推荐第一个选项。它也可能是检查新文件的防病毒软件,即使在这种情况下也不推荐第一个选项。

您可以尝试将以下代码集成到您的 CopyImage 方法中,以便您的应用程序将等到该文件不再使用后再继续:

private Boolean WaitForFile(String filePath)
{
Int32 tries = 0;

while (true)
{
++tries;

Boolean wait = false;
FileStream stream = null;

try
{
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None);
break;
}
catch (Exception ex)
{
Logger.LogWarning("CopyImage({0}) failed to get an exclusive lock: {1}", filePath, ex.ToString());

if (tries > 10)
{
Logger.LogWarning("CopyImage({0}) skipped the file after 10 tries.", filePath);
return false;
}

wait = true;
}
finally
{
if (stream != null)
stream.Close();
}

if (wait)
Thread.Sleep(250);
}

Logger.LogWarning("CopyImage({0}) got an exclusive lock after {1} tries.", filePath, tries);

return true;
}

关于c# - FileSystemWatcher 无法访问文件,因为已在其他进程中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47330439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com