2010-02-09 5 views
7

Target OS: Win2003ли File.Delete() атомный под .NET

Как писал в других SO вопросов о работе файла атомарности, Win32 просто не предназначена для выполнения операций. Тем не менее я задаюсь вопросом, может ли удаление файлов быть неатомным. В конце концов, он либо удаляется, либо нет. Или файл может оставаться в любом другом промежуточном состоянии в файловой системе NTFS, вызванном сбоем системы или чем-то еще во время удаления?

ответ

12

NTFS - journaled file system. Журнал в основном эквивалентен журналу транзакций в базе данных. Это обеспечит согласованность и целостность структур файловой системы, таких как база данных, для своих таблиц. Хотя File.Delete не имеет транзакционного кода на высоком уровне, NTFS поддерживает целостность транзакций на уровне файловой системы. Это может быть неверно для других драйверов файловой системы.

5

Старый вопрос, но если я мог бы добавить к @ ответ Mehdrad, от несколько иной точки зрения ...

В Windows, удаление файла часто даже не полностью синхронны, и это даже не одиночный работа. В этом смысле он определенно не является атомарным.

Если вы посмотрите на инструменты вроде process monitor или посмотрите документацию MSFT для написания драйвера файловой системы, вы заметите, что удаление файла в Windows - это многоэтапный процесс. Сначала вам нужен дескриптор файла. Затем вы устанавливаете его расположение на «deleted». Это помещает файл в состояние, в котором у него есть «ожидающий удаления». Файл даже не будет удален из представления, пока последний дескриптор к нему не будет закрыт. Когда файл находится в этом состоянии, новые попытки открыть файл не сработают с STATUS_DELETE_PENDING. Этот статус больше связан с временем выполнения - если вы вытащили вилку или перезагрузили файлы, они не останутся в этом состоянии.

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

+0

Чтобы уточнить: Как объяснено, процесс выполнения для удаления файла не является атомарным, поскольку он состоит из нескольких шагов. Тем не менее, фактическое действие в файловой системе (NTFS) _is_ атомарно, поэтому удаление физически выполняется в целом или вообще отсутствует. – mafu

+0

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

+1

Да, но физические изменения в файловой системе (в отличие от действий виртуального изменения в ОЗУ, которые вы объяснили) действуют атомарно, если я это правильно понимаю. То есть независимо от того, когда в процессе удаления в NTFS вы прерываете систему, состояние будет согласованным - файл будет либо полностью удален, либо вообще не будет удален. Я считаю, что это важно, поскольку, если бы это было не так, процесс удаления файла должен был бы обрабатываться по-разному в коде пользователя. «Atomic», возможно, несколько вводит в заблуждение термин для всей этой идеи. – mafu