2013-03-07 12 views
8

Я пытаюсь создать огромный текстовый файл с использованием C#, а другой процесс постоянно ищет местоположение и пытается загрузить файл, если он доступен.File.Move атомная операция

Для того, чтобы сделать файл атомным ниже шаги:

1 - Write to file : Filename_temp.txt 
2 - Check if Filename.txt already exists then Delete 
3 - Do a File.Move to the same destination  
    From filename : Filename_temp.txt 
    TO : Filename.txt 

Поскольку C# не имеет переименования, я должен полагаться на File.Move, делает это убедиться, что операция перемещения будет атомной или есть ли другой способ достичь этой атомарности?

+1

что вы * точно * означают, говоря: атомный ход? – Tigran

+0

Можете ли вы обновить логику приложений? Если да - используйте Mutex для доступа к синхронизации – sll

+0

Я рекомендую сначала проверить наличие и удаление. Вы никогда не знаете, когда 'Filename_temp.txt' может уже существовать. – Nolonar

ответ

12

Согласно статье блога MSDN How to do atomic writes in a file, переименовав файл NTFS является атомарной операцией:

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

Конечно, это не гарантирует, что File.Move просто выдает NTFS операции переименования, но я не могу думать о действительных причинах, почему он должен сделать что-то более сложным.

+6

Уверен, есть причина: файл можно перенести на другое устройство. – PythonNut

3

File.Move должно быть «переименовать», если источник и пункт назначения находятся на том же томе. Поэтому, независимо от размера файла, Move должен быть «мгновенным». Я полагаю, что это ваша забота?

Из часто задаваемых вопросов сотрудника MS по адресу http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365240%28v=vs.85%29.aspx у нас есть;

«Часто задаваемый вопрос: Является ли MoveFileEx атомарным, если существующие и новые файлы находятся на одном диске?

Простой ответ «обычно, но в некоторых случаях он будет молча отбрасываться на неатомный метод, поэтому не рассчитывайте на него».

Я думаю, если это на 100% критично, вы можете посмотреть Transactional NTFS. Я не уверен, что в .NET есть еще обертки .Net, поэтому вам может понадобиться использовать P/Invoke.

+0

Точно, это где-то где-то документировано? –

+0

На данный момент ничего не найдено, это скорее функция NTFS, а не .Net. Попробуем найти ссылки. –

+0

+1. Кажется, что в этом вопросе существуют противоречивые источники * от Microsoft *. – Heinzi

0

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

+0

В основном файлы семафора, указывающие DONE, однако для этого требуется, чтобы процесс просмотра изменился, что, к сожалению, не соответствует моим границам. –

Смежные вопросы