File.Move锁定目标文件夹中的文件?

时间:2013-06-13 12:34:14

标签: c# asp.net file file-io move

我使用File.Move将大约2GB的大文件从目录移动到另一个目录。监视desitnation文件夹,如果有任何新文件,它将被上传到CDN。但我们经历了一些部分文件上传到CDN,这意味着,当同一文件从源目录移动到目标目录时,相应的文件被上传到CDN。所以,我需要知道File.Move是否锁定文件目标文件夹,直到文件完成移动?

2 个答案:

答案 0 :(得分:1)

您的问题是目标文件夹上的月亮。

由于你有一个大文件,复制它需要时间,所以发生的事情是:

  1. 您开始移动文件
  2. 启动监控系统并开始上传至CDN
  3. 文件被parialy上传
  4. 您完成了移动文件。
  5. 对此的一个缓解是,假设您的监控系统搜索具有一些扩展的文件 - 将MyBigFile.ext移动到MyBigFile.ext.tmp。完成后,将其重命名为MyBigFile.ext,因此当监控启动时,它将具有完整的文件

答案 1 :(得分:1)

为避免部分上传到CDN,您可以做的是在移动CDN时首先隐藏它,并在完成后取消隐藏它。如果文件仍然隐藏,请将监控工具 不将其转移到CDN。

或者您可以将其锁定,以便其他进程(这是您的监视工具 - CuteFTP)无法访问目标文件,直到流已经完成。

e.g。

    static void Main(string[] args)
    {
        string sourcePath = "mytext.txt";
        string destPath = @"dest\mytext.txt";
        using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open))
        {
            using (FileStream destStream = new FileStream(destPath, FileMode.Create))
            {
                destStream.Lock(0, sourceStream.Length);
                sourceStream.CopyTo(destStream);
            }
        }

        if (File.Exists(sourcePath))
        {
            File.Delete(sourcePath);
        }
    }