我似乎养成了一个不良编码习惯。下面是我写的一段代码示例:
using(StreamReader sr = new StreamReader(File.Open("somefile.txt", FileMode.Open)))
{
//read file
}
File.Move("somefile.txt", "somefile.bak"); //can't move, get exception that I the file is open
我曾认为由于using
语句在StreamReader
上显式调用了Close()
和Dispose()
,所以FileStream
也会被关闭。
但是我遇到的问题只能通过将上述代码块更改为以下内容才得以解决:
using(FileStream fs = File.Open("somefile.txt", FileMode.Open))
{
using(StreamReader sr = new StreamReader(fs))
{
//read file
}
}
File.Move("somefile.txt", "somefile.bak"); // can move file with no errors
在第一个块中通过处理关闭
StreamReader
是否也会关闭底层的FileStream
?或者,我错了吗?
编辑
我决定发布实际有问题的代码块,看看我们能否找到原因。现在只是好奇。
我认为在using
子句中有问题,所以我将所有内容都展开了,但每次仍然无法复制。我在此方法调用中创建了文件,因此我不认为其他任何东西都在该文件上打开了句柄。我还验证了从Path.Combine
调用返回的字符串是否正确。
private static void GenerateFiles(List<Credit> credits)
{
Account i;
string creditFile = Path.Combine(Settings.CreditLocalPath, DateTime.Now.ToString("MMddyy-hhmmss") + ".credits");
StreamWriter creditsFile = new StreamWriter(File.Open(creditFile, FileMode.Create));
creditsFile.WriteLine("code\inc");
foreach (Credit c in credits)
{
if (DataAccessLayer.AccountExists(i))
{
string tpsAuth = DataAccessLayer.GetAuthCode(i.Pin);
creditsFile.WriteLine(String.Format("{0}{1}\t{2:0.00}", i.AuthCode, i.Pin, c.CreditAmount));
}
else
{
c.Error = true;
c.ErrorMessage = "NO ACCOUNT";
}
DataAccessLayer.AddCredit(c);
}
creditsFile.Close();
creditsFile.Dispose();
string dest = Path.Combine(Settings.CreditArchivePath, Path.GetFileName(creditFile));
File.Move(creditFile,dest);
//File.Delete(errorFile);
}
DateTime.Now.ToString("MMddyy-hhmmss")
。你每秒钟创建了多少个文件? - Dave