Я пишу приложение, которое каталогизирует файлы и сохраняет метаданные вместе с ними через сопроводительные файлы.Я пытаюсь добавить операции ввода-вывода в файл, чтобы пользователь мог манипулировать (копировать, переименовывать, перемещать, удалять и т. Д.) Через мое приложение, которое, в свою очередь, также будет манипулировать файлами с коляской.
Однако яЯ обеспокоен тем, что в некоторых случаях одна операция ввода-вывода будет завершена для одного файла, но не для другого, в результате чего файлы останутся в несогласованном состоянии.Поэтому я хотел бы выяснить способ, с помощью которого я могу гарантировать, что все или все операции ввода-вывода завершены.
Во-первых, есть ли способ обеспечить успешность операции ввода-вывода?Я могу, конечно, проверить, если 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;}
}