C#:检查文件是否未锁定和写入

时间:2009-07-24 06:14:21

标签: c# .net file

我想在开始替换文件之前检查文件列表是否正在使用或不可写。 当然我知道从文件检查和文件复制的时间有可能一个或多个文件将由其他人锁定,但我处理这些异常。我想在文件复制之前运行此测试,因为完整的文件列表比在操作中间的文件无法替换时更有可能成功。

你们中的任何人都有正确方向的例子或暗示

4 个答案:

答案 0 :(得分:9)

无法保证您在任何时间点获得的列表将在下一秒保持不变,因为当您回到它们时,其他人可能会控制该文件。

我看到了一种方法 - 通过获取相应的FileStream对象来“锁定”要替换的文件。这样您就可以确保已通过打开所有“可用”文件锁定它们,然后您可以按照自己的方式替换它们。

public void TestGivenFiles(List<string> listFiles)
{
  List<FileStream> replaceAbleFileStreams = GetFileStreams(listFiles);


    Console.WriteLine("files Received = " + replaceAbleFileStreams.Count);
    foreach (FileStream fileStream in replaceAbleFileStreams)
    {
        // Replace the files the way you want to.
        fileStream.Close();
    }
}

public List<FileStream> GetFileStreams(List<string> listFilesToReplace)
{
    List<FileStream> replaceableFiles = new List<FileStream>();
    foreach (string sFileLocation in listFilesToReplace)
    {
        FileAttributes fileAttributes = File.GetAttributes(sFileLocation);
        if ((fileAttributes & FileAttributes.ReadOnly) != FileAttributes.ReadOnly)
        { // Make sure that the file is NOT read-only
            try
            {
                FileStream currentWriteableFile = File.OpenWrite(sFileLocation);
                replaceableFiles.Add(currentWriteableFile);
            }
            catch 
            {
                Console.WriteLine("Could not get Stream for '" + sFileLocation+ "'. Possibly in use");
            }
        }
    }
    return replaceableFiles;
}

那就是说,你最好一个接一个地替换它们,而忽略那些你做不到的。

答案 1 :(得分:0)

您必须打开每个文件才能进行测试。

答案 2 :(得分:0)

答案 3 :(得分:-2)

读一个字节,写同一个字节?