2010-02-08 14 views
8

Próbuję utworzyć zdalny katalog, a następnie napisać do niego plik. Co jakiś czas aplikacja nie działa z systemem System.IO.DirectoryNotFoundException podczas próby zapisu pliku.Problem z latencją Directory.CreateDirectory?

Kiedy piszę ten plik, używam zwróconego obiektu DirectoryInfo, aby pomóc w utworzeniu ścieżki pliku, więc aplikacja wydaje się myśleć, że katalog został utworzony. Jednak katalog nie istnieje.

Czy istnieje szansa, że ​​próbuję napisać do katalogu, zanim system Windows zakończy jego tworzenie? Myślę, że Directory.CreateDirectory nie powróci, dopóki to zadanie nie zostanie ukończone.

+0

Nie mam dobrej odpowiedzi, ale nie mówisz, co oznacza "zdalny". Być może jest to przypadek, w którym serwer zdalny utworzył folder w lokalnym systemie plików, ale nie zwraca go jeszcze podczas przeglądania. Może problem z buforowaniem (czy cokolwiek faktycznie buforuje strukturę systemu plików?). –

+0

Czy serwer zdalny to serwer Windows lub inny typ serwera z uruchomioną Sambą lub podobnym? – Jacob

+0

To jest udział IFS na AS400. Aplikacja działa w systemie Windows, uzyskując dostęp do udziału IFS ze ścieżką UNC. – majorpayne27

Odpowiedz

7

Odpowiedź - Tak. Oczekiwane jest zachowanie, gdy tworzenie pliku/katalogu jest opóźnione. Zwykłe rozwiązanie zaproponowane przez innego komentatora to użycie prób z pewnym opóźnieniem. Zachowanie jest takie samo, niezależnie od funkcji plików: Findfirst, CreateFile, WaitForSingleObject itd.

Innym rozwiązaniem będzie wykorzystanie nowych funkcji transakcyjnych API, które można znaleźć na Vista i nowszych systemach operacyjnych Windows.

Problem jest nieprzyjemny i nigdy nie został zrozumiany przez programistów intensywnie korzystających z plików na innych platformach i przeniesiony do systemu Windows: jak skrypty DOS/CMD, klienci SVN, Cygwin, perl, różne aplikacje java, różne instalatory itp.

+1

+1 Widzimy to cały czas, do tego stopnia, że ​​mamy kompletną bibliotekę połączeń IO, które zostały dostrojone do naszej konfiguracji NAS. –

+0

Czy ktoś wie, jakie są inne magiczne metody? – Mrchief

4

Chociaż nigdy nie doświadczyłem tego zachowania i nie potrafię tego wyjaśnić, pragmatyczne rozwiązanie polega na ustawieniu pętli wokół połączenia uzyskującego dostęp do katalogu. Złap wyjątek DirectoryNotFoundException w tej pętli i spróbuj ponownie uzyskać dostęp kilka razy po krótkiej pauzie za każdym razem. Przeprowadź ponowne wyświetlenie wyjątku, jeśli liczba ponownych prób zostanie przekroczona.

Dodanie szczegółowego rejestrowania w tym miejscu może pomóc w ustaleniu faktycznej przyczyny problemu.

+0

Może być bardziej wydajne sprawdzanie 'Directory.Exists()' zamiast wychwytywania wyjątku, chyba że jest to fałszem zwracającym true, a mimo to dostęp do niego rzuca. –

+0

@CoryCharlton: Jak to jest bardziej wydajne? Sprawdzenie systemu plików jest o rząd wielkości gorsze niż wyrzucenie i sprawdzenie wyjątku, i przypuszczalnie system plików również wykonałby Directory.Exists() w takim przypadku. – Arafangion

6

prostu miałem ten problem i dla mnie sytuacja była tak:

if(!exportDirectory.Exists) 
    exportDirectory.Create(); 

później, gdy w innej klasy, który ma tę samą DirectoryInfo obiekt przekazany do niej robię:

if (!exportDirectory.Exists) 
    throw new DirectoryNotFoundException(exportDirectory.FullName); 

A katalog najwyraźniej nadal nie istnieje (chociaż mam katalog nadrzędny otwarty w oknach i oczywiście widzę go tuż przede mną).

Rozwiązanie znalazłem to po początkowym tworzenia katalogu Byłbym wywołującego:

exportDirectory.Refresh(); 

z Microsoft:

Odświeża stan obiektu. (Dziedziczony z FileSystemInfo.)