该进程无法访问文件“文件名”,因为它正在被另一个进程使用。并且拒绝访问路径“文件名”

时间:2019-08-12 08:11:51

标签: c# ioexception

我正在尝试查找文件的大小并将其存储在string fileSize = string.Empty;中。 为此,我使用唯一的名称保存文件,然后阅读最终删除的文件。

有时我在读取或删除文件时遇到错误。

阅读时出现此错误

  

该进程无法访问文件“文件名”,因为它正在被另一个进程使用。   在System.IO .__ Error.WinIOError(Int32 errorCode,可能是StringFullPath)      在System.IO.FileStream.Init(字符串路径,FileMode模式,FileAccess访问,Int32权限,布尔useRights,FileShare共享,Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,字符串msgPath,布尔bFromProxy,布尔useLongPath,布尔checkHost)      在System.IO.FileStream..ctor(字符串路径,FileMode模式,FileAccess访问,FileShare共享)

在删除时出现此错误

  

拒绝访问路径“文件名”。   在System.IO .__ Error.WinIOError(Int32 errorCode,可能是StringFullPath)      在System.IO.File.InternalDelete(字符串路径,布尔值CheckHost)

我的代码是:

bool checksize(Outlook.Attachment attachment)
{
string currentTime = DateTime.Now.ToString("HHmmssff");
if (!Directory.Exists(GetConfigSettings("folderPath")))
{
Directory.CreateDirectory(GetConfigSettings("folderPath"));
}
attachment.SaveAsFile(GetConfigSettings("folderPath") + "\\"+ currentTime + "_" + attachment.FileName);


using (BinaryReader br = new BinaryReader(File.Open(GetConfigSettings("folderPath") + "\\"+ currentTime + "_" + attachment.FileName), FileMode.Open)))
{
fileSize = br.BaseStream.Length.ToString();
}

File.Delete(GetConfigSettings("folderPath") + "\\"+ currentTime + "_" + attachment.FileName));
//somecode
}

我不明白为什么它会随机抛出异常。

2 个答案:

答案 0 :(得分:2)

不是将附件保存到临时文件,而是使用不相关的阅读器打开该文件,然后检查阅读器的基本流长度,然后使用Outlook.Attachment.Size再次删除该文件。

您可以用以下方法替换整个方法:

bool checksize(Outlook.Attachment attachment)
{
    filesize = attachment.Size.ToString();
    return true;
}

此外,签名bool checksize毫无意义,也没有将文件大小存储在类成员中,也没有将其存储为字符串,但这不是您的问题。

答案 1 :(得分:0)

通过在保存和读取之间添加等待,解决了我的问题。

attachment.SaveAsFile(GetConfigSettings("folderPath") + "\\"+ currentTime + "_" + attachment.FileName);
System.Threading.Thread.Sleep(100);
using (BinaryReader br = new BinaryReader(File.Open(GetConfigSettings("folderPath") + "\\"+ currentTime + "_" + attachment.FileName), FileMode.Open)))
{
fileSize = br.BaseStream.Length.ToString();
}