C#中使用File.Copy复制文件后无法删除临时文件

5
在将文件复制到临时目录后,由于UnauthorizedAccessException异常,我无法删除该副本。这里的想法是获取文件的副本,压缩它,然后删除该副本,但是在删除File.CopyFile.Delete之间的所有代码后,我仍然会收到异常。退出程序会释放锁定并允许我无问题地删除副本。

是否有一种方法可以在不引起此持久锁定的情况下进行复制(并保留文件元数据,如LastModified)?或者解除锁定的方法?在File.Copy完成后,应该对复制的文件进行锁定吗?

我正在使用Visual C# 2010 SP1,针对.NET Framework 4.0。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Xml;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            String FileName = "C:\\test.txt";
            // Generate temporary directory name
            String directory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
            // Temporary file path
            String tempfile = Path.Combine(directory, Path.GetFileName(FileName));
            // Create directory in file system
            Directory.CreateDirectory(directory);
            // Copy input file to the temporary directory
            File.Copy(FileName, tempfile);
            // Delete file in temporary directory
            File.Delete(tempfile);
        }
    }
}

以管理员身份运行VS 2010 - Jibran Khan
@Yeronimo 文件复制得很好。在我终止调试器后,我可以删除该副本。 - jveazey
你能否也删除 C:\test.txt 文件? - Alex Filipovici
2
File.Copy 方法 (String, String)复制文件时,原始文件的属性将保留在副本中。 因此,如果您无法删除 C:\ 中的文件,则使用相同帐户无法在任何地方删除该文件。 - Alex Filipovici
@AlexFilipovici 谢谢。就是这样。该文件被标记为只读。 - jveazey
显示剩余10条评论
2个回答

8

检查您的"C:\\test.txt"文件是否只读。

根据您的评论,这可能是您可以复制但无法删除的原因。

请尝试以下操作:

File.SetAttributes(tempfile, FileAttributes.Normal);
File.Delete(tempfile);

为什么“退出程序会释放锁定并允许我无问题地删除副本”? - VdesmedT

0

看到你已经找到了答案,但我还是会加上这个作为参考;对于你来说,可能的另一种替代方法是创建一个内存流而不是将文件复制到硬盘上。

使用DotNetZip库,你可以这样做:

using (var ms = new MemoryStream())
{
    using (var zip = new ZipFile())
    {
        zip.AddEntry(fileName, data);
        zip.Save(ms);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接