2013-01-09 10 views
5

Mam dziwny problem w naszym projekcie C#, który pojawia się podczas próby utworzenia katalogu za pomocą skryptu IronPython. Jest to kod:Wyjątek IOException ("plik lub katalog już istnieje") podczas próby utworzenia katalogu

targetTemplateDirectory = Path.Combine(Data, "Templates\\CheckedReports") 

if not Directory.Exists(targetTemplateDirectory): 
    Directory.CreateDirectory(targetTemplateDirectory) 

Problemem jest IOException mówi mi, że nie jest możliwe, aby utworzyć folder "H:\ProductName\Data\Templates\CheckedReports" ponieważ plik lub katalog o tej samej nazwie już istnieje.

Według MSDN metoda Directory.CreateDirectory() nie zgłasza żadnego wyjątku, gdy katalog już istnieje.

Wiem, że plik o nazwie "CheckedReports" może być przyczyną tego wyjątku, ale jest bardzo mało prawdopodobne, aby klient ręcznie utworzył ten plik. Oprócz tego nie ma linii kodu, która zawiera słowo "CheckedReports" (oprócz wspomnianego skryptu). Ponadto aplikacja jest używana przez kilka tysięcy klientów, skrypt jest uruchamiany na każdym komputerze i tylko jeden klient zgłosił ten problem.

Czy istnieje możliwość wystąpienia tego wyjątku poza plikiem o tej samej nazwie? Może coś związanego z uprawnieniami, nośnikami wymiennymi lub dyskami sieciowymi?

+0

"ale jest bardzo, bardzo mało prawdopodobne" ... jednak, biorąc pod uwagę dostępne informacje, jest to najbardziej prawdopodobny powód. Nie możesz po prostu sprawdzić (lub pozwolić klientowi sprawdzić), czy istnieje plik o tej nazwie? –

+0

Chciałbym móc :). Wersja aplikacji, z której korzystał ten klient, posiada system zgłaszania błędów, który nie zezwala na żadne dane osobowe ani kontaktowe. Zmieniliśmy to w późniejszej aktualizacji. Dostaliśmy więc tylko komunikat zawierający ślad stosu i identyfikator maszyny, nic więcej. –

Odpowiedz

3

Mieliśmy to samo, aw naszym przypadku było całkiem jasne, że był to problem uprawnień. Spodziewaliśmy się udokumentowanego wyjątku UnauthorizedAccessException, ale to nie jest to, co mamy.

W stosie mamy Directory.CreateDirectory wywołanie Directory.InternalCreateDirectory.

Wewnątrz niego znajduje się ta uwaga:

 //Note that InternalExists may fail due 
     // to Win32 ACL's preventing us from seeing a directory, and this 
     // isn't threadsafe. 

Istnieje więcej notatki o tym, że głębiej do tego faktu, kod może próbować utworzyć katalog, który jest już tam, kiedy nie mogła go zobaczyć .

5

Chociaż byłoby to trochę przesadą, aby mieć to tylko dla jednego użytkownika, powinno być możliwe sprawdzenie, czy istnieje plik o tej nazwie.

FileInfo myFile = new FileInfo(targetTemplateDirectory); 
if (myFile.Exists) 
    myFile.Delete(); 

if (!Directory.Exists(targetTemplateDirectory)) 
    Directory.CreateDirectory(targetTemplateDirectory); 

Prawdopodobnie rozwiązałoby to problem IF z powodu wyjątku we/wy spowodowanego przez plik o tej samej nazwie. Jeśli byłby spowodowany przez użytkownika, ponieważ "nazwa sieci nie jest znana", to też nie miałbym pojęcia.

+0

Może to trochę paranoja i nie ma innego powodu dla tego wyjątku, ale jest śmiertelna, ponieważ jest wyrzucana podczas procesu aktualizacji i uniemożliwia uruchomienie aplikacji. Dam ci rozwiązanie, przynajmniej rozwiązuje wszelkie awarie spowodowane przez plik o tej samej nazwie, bez względu na to, czy jest ręcznie tworzone przez klienta, czy programowo z powodu błędu w naszej aplikacji, naszej konfiguracji lub interakcji z inna aplikacja. –

+0

To jest jedyne rozwiązanie (wielu), które zadziałało dla mnie. –

Powiązane problemy