我有一个简单的C#console-program,它调用下面显示的函数:
static void DirTest()
{
string dir = "Temp";
for (int i = 0; i < int.MaxValue; i++)
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
string file = Path.Combine(dir, "sample.txt");
File.Create(file).Close();
File.Delete(file);
Directory.Delete(dir);
}
}
在某些Win 7机器上,此函数最终会抛出异常(当我超过大约100,000时):
Unhandled Exception: System.UnauthorizedAccessException: Access to the path 'D:\... \Temp\sample.txt' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBU TES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare sh are, Int32 bufferSize, FileOptions options) at System.IO.File.Create(String path) at Exceptions.Program.DirTest() in D:\Exceptions\Program.cs:line 118 at Exceptions.Program.Main(String[] args) in D:\Exceptions\Program.cs: line 167
这些计算机安装了McAfee代理和思科安全代理以及许多其他软件。 Windows防御者被禁用。该程序在管理员控制台中运行。该程序是为.net 3.5编译的。我没有在W2k3或XP机器上看到过。
如果我使用procmon来监视正在访问创建和删除“Temp \ sample.txt”的文件夹的所有事件和进程,我会看到除了测试应用程序之外没有其他进程正在访问该路径。即使在异常之后,procmon中也没有列出其他进程。所以我无法证明这是反病毒的错误。
有人有任何想法可能有什么不对吗? 我是否在Win7上捕获了.net中的错误;)
谢谢!
答案 0 :(得分:1)
代码适用于我的Maschine Windows 7/64位
我猜你的“反病毒”程序是检查每个创建的文件的问题。
我让McAffee跑了但没有思科......
希望这个答案可以提供任何帮助;)
答案 1 :(得分:1)
@whywhywhy
我稍微修改了你的代码以查看我是否可以获得更多信息,如果它在我的结尾会出错。
static void DirTest()
{
string dir = "Temp";
int i = 0;
try
{
for (i = 0; i < int.MaxValue; i++)
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
string file = Path.Combine(dir, "sample.txt");
File.Create(file).Close();
File.Delete(file);
Directory.Delete(dir);
System.Console.WriteLine("Finished i: " + i);
}
}
catch
{
System.Console.WriteLine("Error on i: " + i);
throw;
}
}
我经历了200,000次迭代而没有任何问题。我甚至在循环中注释掉了写作线,这会使它表现得更快,但仍然没有问题。
我不确定您使用的是哪个版本的visual studio,但是您可能想尝试以下几种方法: 1)检查VS和Windows的更新。 2)检查硬盘驱动器的驱动程序更新。
也许您也可以使用print语句运行修改后的代码...以查看它是否是计时问题。 print语句可能足以让事情顺利进行。如果是这种情况,那么我的猜测就和衙门一样。