2012-10-17 19 views
11

Jaki jest najlepszy sposób sprawdzenia istnienia pliku przy użyciu ścieżki względnej.Sprawdzanie istnienia pliku przy użyciu ścieżki względnej

Użyłem następującej metody, ale zwraca ona wartość false, mimo że plik istnieje.

bool a = File.Exists("/images/Customswipe_a.png"); 
+0

w odniesieniu do ścieżki wykonania? Ponadto, jeśli to nie jest sieć, dlaczego używasz '/' instoeed of \\ ' –

+0

Czy przypadkiem pominąłeś tag" asp.net "i zamiast tego potrzebujesz Server.MapPath? –

Odpowiedz

10

To nie jest względna ścieżka. Musisz zostawić pierwszy znak: / inaczej będzie interpretowany jako zrootowany (tzn. C:/images ...)

+7

Jest względna ścieżka technicznie, tylko w stosunku do bieżącego dysku. –

+0

@AlexeiLevenkov Może technicznie, tak. Ale dlaczego rozróżniać ścieżki bezwzględne od względnych, jeśli w ogóle są one względne? – climbage

+0

Moja definicja to "jeśli ścieżka odnosi się do tego samego pliku, niezależnie od konfiguracji środowiska" (różni się także od 'Path.IsPathRooted', który jest innym sposobem patrzenia na niego). Mam bezwzględną ścieżkę wywoływania "\ p \ f.txt" absolutną, ponieważ może ona odnosić się do "c: \ p \ f.txt" lub "d: \ p \ f.txt" w zależności od bieżącej ścieżki ... "c : \ path \ file.txt "lub" \\ server \ path \ file.txt "wyglądają znacznie bardziej absolutnie. –

0

Ścieżka jest względna do lokalizacji twojego pliku binarnego. W przypadku projektu w studio wizualnym byłoby to %PROJECTDIR%/bin/(RELEASE||DEBUG)/ Co chciałbym zrobić, aby umieścić root systemu plików w pliku konfiguracyjnym i użyć go dla swojej względnej ścieżki.

3

Względna ścieżka jest względna w stosunku do bieżącego katalogu roboczego. To może nie być katalog aplikacji. Zadzwoń pod numer GetCurrentDirectory(), aby sprawdzić rzeczywistą ścieżkę, którą testujesz.

1

Ścieżka względna, jest względną wartością . W tym API, to będzie, zgodnie z dokumentacją File.Exists:

względna ścieżka informacja jest interpretowana jako względna do katalogu roboczego prądu .

Więc wszystko zależy tutaj jest to, co jest CurrentDirectoty w momencie wykonania tego zapytania.

Dodatkowo, twoja ścieżka nie jest poprawna Ścieżka na pulpicie (zakładam, że wybierasz ją z jakiegoś pliku lub wiedzy). Aby zrozumieć, że podana ścieżka zawiera niepoprawne znaki, należy użyć funkcji GetInvalidCharacters.

W konkretnym przypadku wystarczy użyć @"\images\Customswipe_a.png".

+0

Obowiązuje dla .Net API, nietypowe użycie "/" zamiast "\", ale prawidłowe. I 'Path.GetInvalidPathChars(). Zawiera ('/')' nie zgłasza "/" jako nieprawidłowy ... –

+0

@AlexeiLevenkov: Nie mówię o .NET API, mówię jak ścieżka aplikacji Desktop. – Tigran

5

Domyślam się, że uruchamiasz ten kod w aplikacji asp.net, to dlatego dostajesz fałszywe.

W asp.net należy użyć Server.MapPath("/images/Customswipe_a.png"), aby uzyskać "poprawną" ścieżkę (względem katalogu głównego aplikacji WWW). W przeciwnym razie otrzymasz ścieżkę lokalną do pliku wykonywalnego serwera WWW (nazwa IIS/WEBDAV/.. dowolna inna).

0

W aplikacji WinForms można uzyskać katalogu pliku exe z

string directory = 
    Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); 

Innym rozwiązaniem wykorzystuje odbicie

string directory = 
    Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
2

Trzeba tylko określić, co plik jest w stosunku do

  • Główny zestaw aplikacji?
  • Bieżący katalog?
  • Katalog danych aplikacji?
  • nazwij to ...

W każdym z tych przypadków, którą proponujemy, aby przekształcić go w bezwzględną ścieżką przez Path.Combine metody:

public static readonly string AppRoot = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 

... 

//calling with a '/' heading makes the path absolute so I removed it 
var fullPath = Path.Combine(AppRoot, "images/Customswipe_a.png"); 
var exists = File.Exists(fullPath); 

ten sposób można zagwarantować, gdzie szukasz. Nawet okna dialogowe Otwórz/Zapisz plik mogą zmienić twój bieżący katalog. Dlatego wywołanie File.Exists bez pełnej ścieżki jest zazwyczaj błędną decyzją.

Powiązane problemy