【问题标题】:File.Copy method makes file inaccessibleFile.Copy 方法使文件不可访问
【发布时间】:2011-06-06 12:04:25
【问题描述】:

我已经为此苦苦挣扎了一段时间。调用 File.Copy 方法后,我无法访问文件。这是我尝试过的:

File.Copy(sourceFile, destinationFile, true);
FileStream fs = File.Open(destinationFile, FileMode.Open);

我在第二行收到 UnauthorizedAccessException。它说:访问路径...被拒绝。我也尝试过here 的建议,但没有奏效。

感谢任何帮助。

编辑:这是我发现的。如果我这样做:

File.Copy(sourceFile, destinationFile, true);
FileStream fs = File.Open(destinationFile, FileMode.Open, FileAccess.Read);

它不会抛出异常。我试图访问的文件是只读的。所以,我尝试像这样删除只读属性:

File.Copy(sourceFile, destinationFile, true);
FileInfo fileInfo = new FileInfo(destinationFile);
fileInfo.IsReadOnly = false;
FileStream fs = File.Open(destinationFile, FileMode.Open, FileAccess.ReadWrite);

我得到了和以前一样的异常。顺便说一句,我检查了我是否可以手动打开文件并进行编辑,我可以。当然,当我取消选中只读复选框时。在调试时,我还在 Windows 资源管理器中检查了文件属性,就在第三行之后,该文件不再是只读的。检查完所有内容后,我不明白为什么在第四行抛出异常。

【问题讨论】:

  • 尝试在两行之间加上System.Threading.Thread.Sleep(1000);,看看是否是时间问题(文件可能仍被File.Copy()锁定
  • 我尝试制作类似的东西。我创建了一个 while 循环,如果没有抛出异常,它应该退出。但它从未退出...
  • 复制前有没有试过去掉只读属性?
  • @Vale:该死,但这是一个开始 :) 当您“双重切换”只读(在源或目标上)时会发生什么?
  • @leppie 这实际上对目标文件有效!我不知道你是怎么想出来的,但它解决了我的问题。非常感谢。

标签: c# file-access


【解决方案1】:

您确定只有使用File.Copy 复制的文件无法打开,而不是目标文件夹中的所有文件吗?这是一个普通的 NTFS 文件夹,还是网络共享?

如果您正在运行防病毒或安全软件,请尝试禁用它。创建文件后,他们通常会打开文件进行扫描。

更新

根据File.Open 抛出的http://msdn.microsoft.com/en-us/library/b9skfh7s.aspx - UnauthorizedAccessException 不会给出消息“访问路径...被拒绝”。 (编辑:我也看不到 File.Copy 的消息,所以这可能是错误的)

我怀疑是您的File.Copy 因该异常而失败,并且您无权读取源文件或写入目标文件。您可能正在查看突出显示的源代码行,它显示了要执行的下一行。

所以 - 也许你的副本失败了,而不是 File.Open

【讨论】:

  • 问题是,文件最初不存在,然后我复制,并尝试访问目标文件。我很肯定我拥有所需的所有权利,因为我正在将其应用于桌面。
  • 天啊,我不知道怎样才能让这件事变得更容易。请回答每个问题,并在单击添加评论之前检查您是否有: 1)您可以打开目标文件夹中的其他文件吗? 2) 这是一个常规的 NTFS 文件夹,还是网络共享? 3) 您是否尝试过禁用所有安全软件/防病毒软件?
  • 不知道第四个yes是干什么用的,也没有说明是NTFS文件夹还是网络共享。尽管如此,我认为您正在查看错误的陈述。请查看更新的答案:)
  • 你那该死的桌面可能是一个网络共享,这可以帮助解释问题。没有理由假设一切都是显而易见的并且可以快速得到解答,显然您无法解决自己的问题并且可能掩盖了一些细节;解决这类事情需要仔细检查细节。
  • 您是否仔细检查了不是 File.Copy 失败?
【解决方案2】:

试试这个!


   private bool CheckFileHasCopied(string FilePath)
    {
        try
        {
            if (File.Exists(FilePath))
            {
                using (File.OpenRead(FilePath))
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }
        catch (Exception)
        {
            Thread.Sleep(2000);
            return CheckFileHasCopied(FilePath);
        }

    }

if (CheckFileHasCopied(destinationFile)) { File.Delete(sourceFile); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 2023-04-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多