Domanda

Sto lavorando in Visual Studio 2005 e ho aggiunto un file di testo che deve essere analizzato facendo clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e aggiungi - > nuovo oggetto. Ciò posiziona il file .txt nella cartella del progetto. Il file .exe di debug si trova nella cartella / bin / debug.

Come posso puntare correttamente al file txt dal codice usando percorsi relativi che risolveranno correttamente il fatto di tornare indietro di due cartelle, risolvendo al contempo di trovarsi nella stessa cartella dopo la pubblicazione della soluzione?

È stato utile?

Soluzione

Dai un'occhiata alla Classe di applicazione . Ha diversi membri che possono essere utilizzati per individuare i file, ecc. Relativi all'applicazione dopo l'installazione.

Ad esempio, Application.ExecutablePath ti dice dove si trova il file EXE in esecuzione; potresti quindi utilizzare un percorso relativo per trovare il file, ad es. .. \ .. \ FileToBeParsed.txt. Tuttavia, ciò presuppone che i file siano distribuiti nella stessa struttura di cartelle della struttura di cartelle del progetto, che di solito non è il caso.

Prendi in considerazione proprietà come CommonAppDataPath e LocalUserAppDataPath per individuare i file relativi all'applicazione una volta distribuito un progetto.

Altri suggerimenti

Se capisco correttamente la tua domanda: seleziona il file in " Esplora soluzioni " ;. Sotto proprietà - > Copia nella directory di output, seleziona " Copia sempre " oppure " Copia se più recente " ;. Per creare azione, seleziona " Contenuto " ;. Questo copierà il file nella cartella / bin / debug al momento della compilazione. Da quel momento in poi dovresti essere in grado di fare riferimento alla radice del progetto.

Un'alternativa alla localizzazione del file su disco sarebbe quella di includere il file direttamente nell'assieme compilato come risorsa incorporata. Per fare ciò, fai clic con il pulsante destro del mouse sul file e scegli " Risorse integrate " come azione di costruzione. È quindi possibile recuperare il file come flusso di byte:

Assembly thisAssembly = Assembly.GetExecutingAssembly();
Stream stream = thisAssembly.GetManifestResourceStream("Namespace.Folder.Filename.Ext");
byte[] data = new byte[stream.Length];
stream.Read(data, 0, (int)stream.Length);

Ulteriori informazioni sulle risorse incorporate sono disponibili qui e qui .

Se stai creando un'applicazione per il tuo uso personale, il suggerimento di David Krep è la cosa migliore: basta copiare il file nella directory di output. Se stai costruendo un assembly che verrà riutilizzato o distribuito, è preferibile l'opzione di risorsa incorporata perché impacchetterà tutto in un unico .dll.

Aggiungerei un passaggio post build che copia il file txt nella cartella di output della configurazione attiva:

xcopy "$(ProjectDir)*.txt" "$(OutDir)"

Ci sono alcune macro definite come " $ (ConfigurationName) " , $(ProjectDir)

Vai a Proprietà del progetto - > Proprietà di configurazione - > Debug

Imposta " Directory di lavoro " a $ (TargetDir)

Quindi puoi fare correttamente riferimento al tuo file usando un percorso relativo nel tuo codice (ad es. " .... \ foo.xml ")

La soluzione Application.ExecutablePath non funziona per gli unittest. Il percorso di vstesthost.exe verrà restituito

System.Reflection.Assembly.GetExecutingAssembly (). La posizione funzionerà ma fornisce il percorso con il nome dell'assembly incluso.

Quindi funziona:
System.Reflection.Assembly.GetExecutingAssembly (). Posizione + " \ .. \ " + " fileToRead.txt "

Ma solo:

fileToRead.txt

Funziona anche. Sembra che la directory di lavoro sia la directory assembly in esecuzione per impostazione predefinita.

È possibile aggiungere un evento post-build per copiare il file .txt nella cartella di output della build. Quindi il tuo codice può presumere che il file sia nella stessa cartella dell'eseguibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top