Explorer.exe锁定创建的文件 - > Directory.Move的访问被拒绝

时间:2014-03-25 09:15:23

标签: c# windows

我有以下问题,是的,我在网上浏览了大约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");
    }

任何建议?

非常感谢!

2 个答案:

答案 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);
    }
}

输出:

enter image description here

通过替换:

重复测试
    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来解决这个问题(丑陋,但还不知道更好的方法)

也许你可以尝试解锁工具,它可以释放手柄。 当您遇到问题时,您使用了哪种操作系统?