讲一串的 十六进制 数 通过 StrAppText = Encoding.Default.GetString(dates);
this.WriteSbd(StrFilePath, StrAppText); private void WriteSbd(string FilePath, string WriteText)
{ if (!File.Exists(FilePath))
{
StreamWriter sw = File.CreateText(FilePath);
sw.Write(WriteText);
sw.Close();
sw.Dispose();
}
}
写进一个 .SBD 文件中第一次写的时候没有错误, 第二次写的时候就出现标题那样的错误。 我想要删除这个文件也会出现这样的错误。 这个文件是作为邮件附件 发送完邮件了 就要删除掉 没有其它进程在使用,对文件的操作也就只有上面一个方法 WriteSbd() , 它也是使用完了就关闭的。 可能是什么原因 会导致出现这样的错误呢?
this.WriteSbd(StrFilePath, StrAppText); private void WriteSbd(string FilePath, string WriteText)
{ if (!File.Exists(FilePath))
{
StreamWriter sw = File.CreateText(FilePath);
sw.Write(WriteText);
sw.Close();
sw.Dispose();
}
}
写进一个 .SBD 文件中第一次写的时候没有错误, 第二次写的时候就出现标题那样的错误。 我想要删除这个文件也会出现这样的错误。 这个文件是作为邮件附件 发送完邮件了 就要删除掉 没有其它进程在使用,对文件的操作也就只有上面一个方法 WriteSbd() , 它也是使用完了就关闭的。 可能是什么原因 会导致出现这样的错误呢?
sw.Dispose();
sw.Close();换个位置试试
多线程操作
不需要
还有,如果是多线程 访问文件的话,可能会出现这个问题,需要进行加锁处理
加锁处理? 能具体说说吗? 我开始怀疑是不是File 这个静态类的原因造成的
这不是你的帖子么?这问题不是一样的么?
//加个同步属性,来锁
[MethodImpl(MethodImplOptions.Synchronized)]
private void WriteSbd(string FilePath, string WriteText)
{ if (!File.Exists(FilePath))
{
StreamWriter sw = File.CreateText(FilePath);
sw.Write(WriteText);
sw.Close();
sw.Dispose();
}
}
或者你加一个 try catch 包一下 在catch里加一个 Thread.Sleep(1000);在加调用本方法
就是让他循环调用本身 1秒调用一次,,直到完成这个过程,,当然这样可能造成死锁最好的办法就是你可以通过一个变量 来控制此方法是否被占用,被占用就等待
作附件发送 如果是邮件发送等待的话 程序是会停在那里的。 等邮件发送成功了 才能执行下一步。 应该没有可能说 程序发送邮件成功了以后 client.Send(mail); 还在使用这个附件吧?
/// <summary>
/// 保存附件
/// </summary>
/// <param name="dates"></param>
/// <param name="path"></param>
private void SaveFile(byte[] dates, string StrSavePath)
{
try
{
string StrAppText = Encoding.Default.GetString(dates);
////this.WriteSbd(StrFilePath, StrAppText);
//if (File.Exists(StrSavePath)) File.Delete(StrSavePath);
//File.AppendAllText(StrSavePath, StrAppText); File.WriteAllText(StrSavePath, StrAppText);
}
catch (Exception e)
{
log.WriteLog("File被占用", e.Message);
Thread.Sleep(10000);
this.SaveFile(dates, StrSavePath);
}
}
我用这个方法测试了 下 在调用这个放的后一个方法出打了断点跟踪。 半个小时过去了 还在这里死循环
mail.Dispose();就没有问题了原来 MailMessage 也需要释放资源。 谢谢大家