Подтвердить что ты не робот

С#: проверить, не заблокирован ли файл и перезаписывается ли он

Я хочу проверить, используется ли список файлов или недоступен для записи, прежде чем я начну заменять файлы. Конечно, я знаю, что время от проверки файлов и копирование файлов есть вероятность того, что один или несколько файлов будут заблокированы кем-то другим, но я обрабатываю эти исключения. Я хочу запустить этот тест перед копированием файла, потому что полный список файлов имеет больше шансов на успех, чем если файл в середине операции не может быть заменен.

У кого-нибудь из вас пример или подсказка в правильном направлении

4b9b3361

Ответ 1

Нет никакой гарантии, что список, который вы получите в любой момент времени, останется таким же на следующей секунде, что и кто-то другой может взять под контроль файл к моменту возвращения к ним.

Я вижу один путь - "LOCK" - файлы, которые вы хотите заменить, получая соответствующие объекты 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;
    }

Тем не менее, вам лучше попытаться заменить их один за другим и игнорировать те, которые вы не можете.

Ответ 2

Вы должны открыть каждый файл для записи, чтобы проверить это.

Ответ 4

Прочитать один байт, записать один и тот же байт?