【问题标题】:File.Move making a copy of fileFile.Move 复制文件
【发布时间】:2011-10-16 02:20:36
【问题描述】:

我有一些代码正在尝试创建一个临时文件以用作 zip 文件。

string tempPath = Path.GetTempFileName(); 
string targetPath = 
    string.Concat(Path.GetTempPath(),"//",Path.GetFileNameWithoutExtension(tempPath),".zip");
File.Move(tempPath, targetPath);

但是正在创建一个新文件,而不是移动(重命名)临时文件。

我确实很困惑......

凯文

【问题讨论】:

  • 致电Path.CombinePath.ChangeExtension
  • 你为什么使用“//”?你是说“\\”吗?

标签: c# .net file io


【解决方案1】:

这是预期的行为。如果你想删除旧文件,你需要明确地这样做。

【讨论】:

  • 这是File.Move,不是 File.Copy。
  • 嗯?我在File.Move 文档中没有发现任何内容表明它会复制而不是移动。
  • 移动是一个两步过程:1) 复制,2) 删除。在这种情况下,Delete 会静默失败。
【解决方案2】:

我想这就是你要找的东西:

FileInfo.MoveTo()

            var newFiles = System.IO.Directory.GetFiles(updateLocation).Select(file => new FileInfo(file));

            var workingDirectory = Environment.CurrentDirectory;
            var existingFiles = System.IO.Directory.GetFiles(workingDirectory).Select(file => new FileInfo(file));

            newFiles.ToList().ForEach(newFile =>
            {
                var matchedFile = existingFiles.ToList().Find(delegate(FileInfo file) { return file.Name == newFile.Name; });

                if(matchedFile != null)
                {
                    if(newFile.LastWriteTimeUtc != matchedFile.LastWriteTimeUtc)
                    {
                        if(!Directory.Exists(TEMP_DIRECTORY_NAME))
                            Directory.CreateDirectory(TEMP_DIRECTORY_NAME);

                        matchedFile.MoveTo(Path.Combine(TEMP_DIRECTORY_NAME, matchedFile.Name));
                        newFile.CopyTo(Path.Combine(workingDirectory, newFile.Name));
                    }
                }
                else
                    newFile.CopyTo(Path.Combine(workingDirectory, newFile.Name));
            });'

【讨论】:

  • File.Move 和 FileInfo.Move 都表示“将指定文件移动到新位置,提供指定新文件名的选项。”
  • 我上周才使用过这种方法,它给了我 OP 正在寻找的行为。
  • 我只是说它的措辞与他正在使用的 File.Move 相同。
  • 好吧,我为自己的防守道歉!
【解决方案3】:

你的代码对我有用。

Path.GetTempFileName()

将在您的机器 %TEMP% 目录中创建一个新的 0 字节临时文件。运行 File.Move 行后,临时文件使用 .zip 扩展名重命名。

在此之后,您现在可以使用该文件了:

using (var writeStream = new FileStream(targetPath, FileMode.Open, FileAccess.ReadWrite))
{
    // CODE HERE

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多