C# 设置简单文件流时遇到问题

C# 设置简单文件流时遇到问题,c#,C#,我正在编写一个应用程序,允许用户从计算机导入图片并在我的应用程序中查看。用户在图片下方还有一个导入按钮,他/她可以在计算机中选择图片的目的地 我的问题是我遇到了以下异常: System.IO.IOException:'进程无法访问文件'D:\Workspaces\u Foo\Foo\Theme\MyPic.png',因为另一个进程正在使用该文件。' 当我调试它时,我会找到它断开的地方。它位于: string image = Constants.ImageName; if (image != "N

我正在编写一个应用程序,允许用户从计算机导入图片并在我的应用程序中查看。用户在图片下方还有一个导入按钮,他/她可以在计算机中选择图片的目的地

我的问题是我遇到了以下异常:

System.IO.IOException:'进程无法访问文件'D:\Workspaces\u Foo\Foo\Theme\MyPic.png',因为另一个进程正在使用该文件。'

当我调试它时,我会找到它断开的地方。它位于:

string image = Constants.ImageName;
if (image != "NONE")
{
   using (var stream = File.OpenRead(SourceDir + ImageName))
   {  
     Directory.CreateDirectory(Path.GetDirectoryName(DestinationDir + "\\" + image));

     File.Copy(SourceDir + "\\" + image, DestinationDir + "\\" + image, true); //breaks here...
   }                
 }

我认为通过使用文件流,我可以继续进行图片传输。有人能告诉我为什么会出现此错误吗?

您正在为该文件打开一个流。这将打开文件并将其标记为正在使用

然后您使用File.Copy来复制它,但操作系统说该文件正在使用中(它不够聪明,没有注意到您自己的进程正在使用它!)

忘记流,试试这个

string image = Constants.ImageName;
if (image != "NONE")
{
    Directory.CreateDirectory(Path.GetDirectoryName(DestinationDir + "\\" + image));

    File.Copy(SourceDir + "\\" + image, DestinationDir + "\\" + image, true);
}

您正在打开文件的流。这将打开文件并将其标记为正在使用

然后您使用File.Copy来复制它,但操作系统说该文件正在使用中(它不够聪明,没有注意到您自己的进程正在使用它!)

忘记流,试试这个

string image = Constants.ImageName;
if (image != "NONE")
{
    Directory.CreateDirectory(Path.GetDirectoryName(DestinationDir + "\\" + image));

    File.Copy(SourceDir + "\\" + image, DestinationDir + "\\" + image, true);
}

您是否尝试读取错误消息:
另一个进程正在使用它
?这可能意味着两件事:(A)文件确实被计算机上的另一个进程使用/锁定。您可以使用类似LockHunter的工具来识别另一个流程。但是,这也可能意味着(B)您自己的程序已经打开了该文件(例如,使用另一个filestream),并且第一次打开该文件时没有将其FileShare属性设置为FileShare.ReadWrite,这将导致再次尝试打开已打开的文件失败。如果是(B)情况,您需要调试您的程序,以了解程序如何/为什么/在何处尝试打开文件两次。此外,如果打开文件只是为了从中读取,则不要使用FileAccess.ReadWrite、FileShare.ReadWrite参数。只需使用
File.OpenRead()
@elgonzo我将filestream从File.Open更改为File.OpenRead(),这似乎解决了最初的问题。现在我在调用File.Copy时遇到了错误(请在2分钟内查看上面更新的代码),您的根本问题仍然存在。切换到File.OpenRead()允许打开文件两次,这种情况仍然存在。您真正的问题很可能是程序中的某些错误逻辑导致文件被打开两次,这可能也是您现在看到的错误的原因。正如我所说的,您需要彻底调试您的程序,以找到问题的根源……请尝试在(编辑的)问题中理解您自己的源代码。使用文档阅读每一行的功能。在试图理解代码实际执行的操作时,不要依赖于您自己的(可能是错误的)假设。使用调试器单步执行并查看代码将有助于更好地理解代码。您是否尝试读取错误消息:
另一个进程正在使用它
?这可能意味着两件事:(A)文件确实被计算机上的另一个进程使用/锁定。您可以使用类似LockHunter的工具来识别另一个流程。但是,这也可能意味着(B)您自己的程序已经打开了该文件(例如,使用另一个filestream),并且第一次打开该文件时没有将其FileShare属性设置为FileShare.ReadWrite,这将导致再次尝试打开已打开的文件失败。如果是(B)情况,您需要调试您的程序,以了解程序如何/为什么/在何处尝试打开文件两次。此外,如果打开文件只是为了从中读取,则不要使用FileAccess.ReadWrite、FileShare.ReadWrite参数。只需使用
File.OpenRead()
@elgonzo我将filestream从File.Open更改为File.OpenRead(),这似乎解决了最初的问题。现在我在调用File.Copy时遇到了错误(请在2分钟内查看上面更新的代码),您的根本问题仍然存在。切换到File.OpenRead()允许打开文件两次,这种情况仍然存在。您真正的问题很可能是程序中的某些错误逻辑导致文件被打开两次,这可能也是您现在看到的错误的原因。正如我所说的,您需要彻底调试您的程序,以找到问题的根源……请尝试在(编辑的)问题中理解您自己的源代码。使用文档阅读每一行的功能。在试图理解代码实际执行的操作时,不要依赖于您自己的(可能是错误的)假设。使用调试器单步执行并查看代码将有助于更好地理解代码。