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

Posted

技术标签:

【中文标题】Explorer.exe 锁定创建的文件 --> Directory.Move 的访问被拒绝【英文标题】:Explorer.exe locks created file --> access denied for Directory.Move 【发布时间】:2014-03-25 09:15:22 【问题描述】:

我有以下问题,是的,我在网上浏览了大约 1 小时,但没有找到任何可以解决我的问题的东西。

我有一个文件夹,里面有大约 100 个文件,称为“媒体”。在我的 Delphi Setup.exe(在 C# 中也不起作用)中,我允许用户通过简单地将其重命名为他想要的任何名称来备份此“媒体”文件夹,例如“media_v1”。而且效果很好。

如果我在这个“媒体”文件夹中创建一个新文件,它也可以是一个空的 txt,重命名过程不再起作用。出现错误“5 Access denied”。

现在,我在网上寻找了一些帮助,发现它可以通过其他进程等锁定。事实:

即使进程资源管理器也不会显示任何锁定任何文件的句柄或 dll,但如果我之前终止资源管理器任务,它会再次正常工作。

    private void button1_Click(object sender, EventArgs e)
    

        Directory.Move(@"D:media\folder", @"D:\media\folder_v1");
    

有什么建议吗?

非常感谢!

【问题讨论】:

访问被拒绝错误消息表明这是一个权限问题。什么是操作系统?发布您的 C# 代码。 请更新。 1. 是否仅针对该新文件出现“拒绝访问”错误(可能是)? 2. 该文件是如何创建的? 听起来你的代码有错误。如果我们能看到您的代码,我们可能会有所帮助。请edit您的问题向我们展示您在做什么。 不要认为它是权限问题,因为它在我杀死资源管理器后才起作用,所以权限仍然是一样的。代码如下:(我把它贴在上面是因为它在这里看起来很糟糕。它只是一个虚拟代码,但也会发生错误。 1.它没有告诉我哪个文件导致错误,但它发生在创建之后,所以可能是的。 2.用explorer自己,右键-->新建-->txt 【参考方案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();

并在资源管理器中手动创建一个新的文本文件,然后继续该程序也可以正常工作。

【讨论】:

好提示。但是我发布的代码就是所有的代码。为此,我创建了一个演示项目。只有这一行。有趣的事实:只要没有子目录,它就可以工作。当我在现有子目录中创建子目录或(如果它是现有文件夹)文件时,我就不再工作了。 @Michel 很遗憾,我仍然无法重现您的问题。你的描述不是很清楚。这需要清楚地描述重现问题所需的确切步骤。 这是因为问题很难描述^^...在我这边重现:创建一个子文件夹,在其中创建一个文件,然后顶部文件夹的移动方法不再起作用并出现“访问被拒绝”错误。【参考方案2】:

我可以确认 Michel 在最新补丁级别 05/2014 的 Windows XP SP3 上描述的问题。 我有很多不同的电脑都遇到了这个问题。

这一定是 Windows 中的错误,因为每次杀死并重新启动“explorer.exe”都会有所帮助。

相信我,您的代码没有任何问题。

也许 explorer.exe 存在某种句柄泄漏。

我通过在我的脚本中杀死并重新启动 explorer.exe 来解决这个错误(丑陋,但还不知道更好的方法)

也许您可以尝试一个解锁工具,它可以释放手柄。 您遇到问题时使用的是哪个操作系统?

【讨论】:

以上是关于Explorer.exe 锁定创建的文件 --> Directory.Move 的访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

eclipse怎么打开project explorer

windows打开程序过程

Google调用explorer.exe打开本地文件

无法找到脚本文件 C:/Windows/explorer.exe:574323188.vbs

Explorer.EXE不支持此接口……

Windows后登陆没有图形界面只有cmd,explorer.exe不能启动