2012-10-17 11 views
11

Qual è il modo migliore per verificare l'esistenza di un file utilizzando il percorso relativo.Verifica dell'esistenza di un file utilizzando il percorso relativo

Ho usato il seguente metodo ma restituisce false nonostante il fatto che il file sia esistente.

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

relativo al percorso di esecuzione? Inoltre, se questo non è web, perché stai usando '/' insteaed di '\\' –

+0

Hai per caso perso il tag "asp.net" e hai invece bisogno di Server.MapPath? –

risposta

10

Questo non è un percorso relativo. È necessario lasciare il primo / altrimenti verrà interpretato come root (cioè C:/images ...)

+7

È il percorso relativo tecnicamente, solo relativo al disco corrente. –

+0

@AlexeiLevenkov Forse tecnicamente, sì. Ma perché distinguere tra percorsi assoluti e relativi se sono tutti comunque relativi a qualcosa? – climbage

+0

La mia definizione è "se il percorso fa riferimento allo stesso file indipendentemente dalla configurazione dell'ambiente" (inoltre è diverso da "Path.IsPathRooted" che è un altro modo di guardarlo). Ho difficoltà a chiamare il percorso "\ p \ f.txt" in quanto può riferirsi a "c: \ p \ f.txt" o "d: \ p \ f.txt" a seconda del percorso corrente ... "c : \ path \ file.txt "o" \\ server \ path \ file.txt "mi sembrano molto più assoluti. –

0

Il percorso è relativo alla posizione del file binario. Nel caso di un progetto di Visual Studio, questo sarebbe %PROJECTDIR%/bin/(RELEASE||DEBUG)/

Quello che vorrei fare è mettere la radice del file system in un file di configurazione, e l'uso che per il percorso relativo.

3

Il percorso relativo è relativo alla directory di lavoro corrente. Potrebbe non essere la directory dell'applicazione. Chiama GetCurrentDirectory() per verificare il percorso effettivo che stai testando.

1

Il percorso relativo, è un relativo a a qualcosa. In questa API, sarà, secondo la documentazione File.Exists:

informazioni sul percorso relativo viene interpretato come relativo alla directory di lavoro corrente .

Quindi tutto dipende qui è ciò che è CurrentDirectoty al momento dell'esecuzione di questa query.

Inoltre, il percorso non è valido Percorso del desktop (presumo che lo si scelga da qualche file Web o conoscenza). Per capire se il percorso specificato contiene caratteri non validi, utilizzare la funzione GetInvalidCharacters.

Nel tuo caso specifico sarebbe sufficiente usare @"\images\Customswipe_a.png".

+0

È valido per le API .Net, inusuale per utilizzare "/" anziché "\", ma valido. E 'Path.GetInvalidPathChars(). Contains ('/')' non riporta "/" come non valido ... –

+0

@AlexeiLevenkov: Non dico per .NET API, dico come percorso applicazione Desktop. – Tigran

5

Immagino che si stia utilizzando questo codice nell'applicazione asp.net, ecco perché si ottiene il falso.

In asp.net è necessario utilizzare Server.MapPath("/images/Customswipe_a.png") per ottenere il percorso "corretto" (relativo alla directory principale dell'applicazione Web). Altrimenti si ottiene il percorso locale all'eseguibile del server web (IIS/WEBDAV/.. nome un altro).

0

In un'applicazione WinForms è possibile ottenere la directory del file exe con

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

Un'altra soluzione utilizza la riflessione

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

Hai solo bisogno di definire ciò che il file è relativo alla

  • L'assieme principale dell'applicazione?
  • Directory corrente?
  • Directory dei dati dell'applicazione?
  • nome ...

In ciascuno di questi casi, io suggerirei di convertirlo in un percorso assoluto per Path.Combine metodo:

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); 

In questo modo si può garantire in cui si sta cercando. Anche le finestre di dialogo Apri/Salva file possono cambiare la directory corrente. Pertanto, chiamare File.Exists senza percorso completo è in genere una decisione sbagliata.

Problemi correlati