2013-03-07 6 views
8

Próbuję wygenerować ogromny plik tekstowy przy użyciu C#, a inny proces stale szuka lokalizacji i próbuje pobrać plik, jeśli jest dostępny.Operacja atomowa File.Move

Aby plik atomowej poniżej kroki:

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 

Ponieważ C# nie posiada Zmień nazwę, muszę polegać na File.Move, czy to upewnij się, że operacja będzie ruch atomowy czy istnieje inny sposób na osiągnięcie tej atomowości?

+1

co właściwie masz na myśli mówiąc: ruch atomowy? – Tigran

+0

Czy możesz zaktualizować obie logiki aplikacji? Jeśli tak, użyj Mutex do zsynchronizowania dostępu. – sll

+0

Polecam najpierw sprawdzenie istnienia i usunięcie. Nigdy nie wiadomo, kiedy 'Filename_temp.txt' może już istnieć. – Nolonar

Odpowiedz

12

Według blogu MSDN How to do atomic writes in a file artykułu, zmiana nazwy plików NTFS to operacja atomowa:

Rozwiązanie? Pamiętajmy, że zmiany metadanych są atomowe. Zmień nazwę to taki przypadek. Tak więc możemy po prostu wykonać zapis do pliku tymczasowego, a gdy wiemy, że zapisy są na dysku (zakończone i przepłukane), możemy zamienić stary plik na nowy.

przyznane, to nie gwarantuje, że File.Move tylko wystawia NTFS zmień pracę, ale nie mogę myśleć o ważnej przyczyny, dlaczego to robią coś bardziej skomplikowana.

+6

Pewnie jest powód: plik może zostać przeniesiony na inne urządzenie. – PythonNut

3

File.Move powinna być "zmiana nazwy", jeśli źródło i miejsce docelowe są na tym samym wolumenie. Tak więc, niezależnie od wielkości pliku, ruch powinien być "natychmiastowy". Zakładam, że to twoja sprawa?

Od FAQ od pracownika MS na http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365240%28v=vs.85%29.aspx mamy;

"Często zadawane pytanie: czy MoveFileEx jest atomowe, czy istniejące i nowe pliki znajdują się na tym samym dysku?

Prosta odpowiedź brzmi "zwykle, ale w niektórych przypadkach po cichu powraca do metody nieatomowej, więc nie licz na to".

Domyślam się, że w 100% krytyczne można spojrzeć na Transactional NTFS. Nie jestem pewien, czy w tej sieci są jeszcze owijki, więc możesz potrzebować użyć P/Invoke.

+0

Dokładnie to jest gdzieś udokumentowane? –

+0

W tej chwili nie można znaleźć niczego, jest to raczej funkcja NTFS niż .Net. Będzie próbował znaleźć referencje. –

+0

+1. Wydaje się, że w tym punkcie są sprzeczne źródła * firmy Microsoft *. – Heinzi

0

Możesz zapisać swój plik bezpośrednio do miejsca docelowego i użyć pliku sygnału o zerowym rozmiarze, który zostanie utworzony po przygotowaniu dużego pliku. Twój proces czytelnika może wyszukać plik z sygnałem i odczytać ogromny plik po udostępnieniu pliku z sygnałem. Myślę, że to rozwiąże problem "atomowości".

+0

Zasadniczo pliki semaforów oznaczające ZROBIONE, jednak wymaga to zmiany procesu oglądania, który jest niestety poza moimi granicami. –