Как я могу гарантировать, что несколько операций ввода-вывода файлов успешно? - PullRequest
2 голосов
/ 10 июля 2010

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

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

Во-первых, есть ли способ обеспечить успешность операции ввода-вывода?Я могу, конечно, проверить, если File.Exists.Но есть и другие потенциальные проблемы, такие как доступность файла, например, статус «только для чтения» или блокировка другим пользователем, еще более усложняют ситуацию.Даже если я закончу тестирование на все возможные проблемы, все еще существует маловероятная, но возможная вероятность того, что файлы изменятся в промежутке между тестом и фактической операцией ввода-вывода.Скажем, файл удален между File.Exists(somefile.txt) и File.Copy(somefile.txt,somefile2.txt).

В качестве альтернативы я также думал о создании набора классов, которые представляют операции ввода-вывода файла, но с возможностью отмены после выполнения операции.Таким образом, моя программа может пытаться выполнить несколько операций ввода-вывода, но позже сможет легко отменить все изменения, если одна операция завершится с ошибкой.См. Интерфейс ниже.

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

public enum IOActionStatus {Not Run, Successful, Failed}

public interface
{
    public bool Go();
    public void Undo();
    public IOActionStatus Status;
}


public class CopyFileAction:IOAction
{
    public Copy File Action(string sourcepath, string destPath)
    {
    }

    public bool Go()
    {
        //attempts to to copy file
    }

    public void Undo()
    {
        //deletes the copied file if Go() was successful
    }

    public IOActionStatus Status{get; private set;}
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2010

Транзакции файловой системы существуют в Windows Vista и выше (только NTFS; поддержка FAT отсутствует).

Для этого не существует прямого управляемого API (отличная статья , на которую ссылается andypP / Invoke).Я просил добавить его в пакет кода Windows API;Вы можете подать запрос здесь .

1 голос
/ 10 июля 2010

этот MSDN Magazine статья предполагает, что Windows Vista (и выше) поддерживает транзакции файловой системы и что даже доступен управляемый API.НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...