我有以下问题,是的,我在网上浏览了大约1个小时,发现什么都不能解决我的问题。
我有一个包含大约100个文件的文件夹,称为“媒体”。在我的Delphi Setup.exe中(也不能在C#中工作)我允许用户通过简单地将其重命名为他想要的任何内容来备份这个“media”文件夹,例如“media_v1”。它运作得很好。
如果我在此“media”文件夹中创建一个新文件,它也可能是一个空的txt,重命名过程不再起作用。出现错误“5 Access denied”。
现在,我在网上找了一些帮助,发现它可以通过其他进程锁定等等。事实:
即使Process Explorer也没有显示任何锁定任何文件的句柄或DLL,但如果我之前杀死了资源管理器任务,它再次正常工作。
private void button1_Click(object sender, EventArgs e)
{
Directory.Move(@"D:media\folder", @"D:\media\folder_v1");
}
任何建议?
非常感谢!
答案 0 :(得分:1)
这是一个SSCCE,它表明您的方法非常实用。这个例子有效,而你的代码并不意味着你的代码比你向我们展示的更多。你正在做的其他事情正在导致问题。向我们展示您的计划中的相关代码是必要的。更好的是,自己制作一个证明问题的SSCCE。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Original Directory Contents : ");
string[] fileEntries = Directory.GetFiles(@"C:\Test\stuff");
foreach (string fileName in fileEntries)
Console.WriteLine(fileName);
Console.WriteLine("Moving Directory... ");
Directory.Move(@"C:\Test\stuff", @"C:\Test\stuff2");
Console.WriteLine("Creating New File... ");
File.WriteAllText(@"C:\Test\stuff2\new.txt", "test");
Console.WriteLine("New Directory Contents : ");
fileEntries = Directory.GetFiles(@"C:\Test\stuff2");
foreach (string fileName in fileEntries)
Console.WriteLine(fileName);
Console.WriteLine("Moving Directory... ");
Directory.Move(@"C:\Test\stuff2", @"C:\Test\stuff");
fileEntries = Directory.GetFiles(@"C:\Test\stuff");
foreach (string fileName in fileEntries)
Console.WriteLine(fileName);
}
}
输出:
通过替换:
重复测试 Console.WriteLine("Creating New File... ");
File.WriteAllText(@"C:\Test\stuff2\new.txt", "test");
带
Console.ReadLine();
并在资源管理器中手动创建一个新的文本文件,然后继续该程序也没有问题。
答案 1 :(得分:0)
我可以确认Michel在Windows XP SP3上使用最新补丁级别05/2014描述的问题。 我有许多不同的PC都遇到了这个问题。
它必定是Windows中的一个错误,因为杀死并重新启动" explorer.exe"每次都有帮助。
相信我,你的代码没有任何问题。
也许explorer.exe会遇到某种句柄泄漏。
我通过在我的脚本中杀死并重新启动explorer.exe来解决这个问题(丑陋,但还不知道更好的方法)
也许你可以尝试解锁工具,它可以释放手柄。 当您遇到问题时,您使用了哪种操作系统?