2009-03-20 10 views
14

W moim nowym kodzie jestem nie za pomocą ciągów do przekazywania ścieżek katalogów lub nazw plików. Zamiast tego używam DirectoryInfo i FileInfo, ponieważ wydają się enkapsulować wiele informacji.Dobre powody, aby przekazywać ścieżki jako łańcuchy zamiast używać DirectoryInfo/FileInfo

Widziałem wiele kodu, który używa łańcuchów do przekazywania informacji o katalogach, a następnie "dzieli" i "środkowy" i "instr" w długich niezrozumiałych stwierdzeniach, dopóki nie otrzymają części katalogu, którego szukają.

Czy istnieje jakiś dobry powód do przekazywania ścieżek jako łańcuchów?

Odpowiedz

10

Ogólnie uważam, że przechowywanie informacji w FileInfo/DirectoryInfo jest lepsze. Jest wiele użytecznych funkcji w tych klasach, a także wiele zabezpieczeń związanych z tym, że znacznie łatwiej jest sprawdzić istnienie pliku, zobaczyć pierwotnie określony plik itp.

Jedyne miejsce, w którym chciałbym (potencjalnie) przekazać ścieżkę jako łańcuch zamiast używać opcji FileInfo i DirectoryInfo, gdyby ścieżka była przekazywana między AppDomains lub między procesami, itp.

Obie wartości FileInfo i DirectoryInfo działają poprawnie w obrębie granic AppDomain (ponieważ " re Serializable), ale w tej sytuacji mają dużo więcej narzutów. Jeśli sprawy często się zmieniają, może to mieć wpływ.

W tym przypadku trzymałbym się z FileInfo i DirectoryInfo, chyba że zauważyłem, że podczas profilowania wystąpił zauważalny problem i próbowałem zmniejszyć ilość zserializowanych danych. Gdybym nie wpadł na problemy z wydajnością, trzymałbym się tych klas, ponieważ zapewniają one wiele bezpieczeństwa i funkcjonalności.

+0

Należy pamiętać, że należy utworzyć nową wartość FileInfo/DirectoryInfo, jeśli plik zmienił swój istniejący lub zmodyfikowany znacznik czasu. – sighol

4

Gdy trasa jest w aplikacji (czyli nie jest w prostym pliku konfiguracyjnego tekst) nie, nie ma powodu.

Tylko raz (mogę myśleć) może być przydatna jest podczas współdziałania z kodem, który akceptuje tylko ścieżki jak strun.

5

DirectoryInfo i FileInfo są strasznie ciężkie do przejścia wokół jeśli wszystko czego potrzebujesz to ścieżka. Byłbym bardziej zaniepokojony śmieciami typu "split and mid and instr". Poznają sposoby:

Path.GetFileName
Path.GetDirectoryName
Path.Combine
itp ...

te są z klasy System.IO.Path, btw.

+0

Pamiętaj, że kiedy przekazujesz instancję do funkcji, przekazujesz kopię referencji, a nie kopię całego obiektu! Więc wszystko, co naprawdę przechodzisz, jest kopią wskaźnika ... –

+0

Wierzę, że problem nie polega na tym, ile bajtów jest przekazywanych, ale na narzuceniu użycia FileInfo/DirectoryInfo, który musi sondować plik na różne sposoby, aby buforować informacje na jego temat. –

+1

Najpierw jednak zoptymalizuj pod kątem czytelności. –

0

Napotkano problemy podczas przekazywania informacji FileInfo do DMZ. O ile widzę - popraw mnie, jeśli się mylę - FileInfo wykonuje kontrolę uprawnień podczas deserializacji, a to nie zadziała z DMZ i spowoduje, że "path not found". Utwórz i przenieś niestandardowy obiekt z danymi, które chcesz.

0

myślę, że potrzebujemy klasę do hermetyzacji plik lub katalog ścieżkę, zamiast używania surowych sznurki i manipulowania nimi za pomocą statycznych klasy System.IO.Path. Jednakże, I don't find DirectoryInfo and FileInfo suitable, ponieważ wydają się być przeznaczone raczej do wykonywania operacji na plikach/katalogach zamiast operacji na ścieżkach. Jeśli utworzysz niestandardową klasę do manipulacji ścieżką, możesz podać more user friendly path manipulation functionality.

Powiązane problemy