StreamReader si lamenta che il file non esiste, ma lo fa
-
23-09-2019 - |
Domanda
Ho una domanda che è localizzato per l'uso in tutta Europa.
Ho un opzione di menu che carica un file dal disco.
Questa operazione funziona bene sulla mia macchina dev ma non funziona nella macchina virtuale che uso per testare altri sistemi operativi _ per esempio francese, spagnolo ecc.
Un FileNotFoundException viene generato quando lo StreamReader tenta di aprire il file.
Si dice " 'Impossibile trovare il file C: \ Program Files \ MyCompany \ MyTool \ bin \ Files \ debug.txt'"
La cosa è, il file non esiste, nella posizione corretta e con il nome corretto.
I nomi delle directory sul target sistema operativo (francese) sono gli stessi che la macchina dev.
Tutte le idee?
string ourPath = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
try
{
System.IO.StreamReader sr = System.IO.File.OpenText(ourPath + @"\bin\Files\debug.txt");
string input = null;
while ((input = sr.ReadLine()) != null)
{
m_text.Append(input);
}
sr.Close();
}
catch (System.IO.FileNotFoundException)
{
MessageBox.Show("LoadDebugOptions: File Not Found: " + ex.Message);
}
Soluzione
Ok trovato il problema.
ha stabilito che il sistema operativo è stato leggendo il file visualizzato in Esplora risorse come "debug.txt" come "debug.txt.txt".
Questo è stato determinato utilizzando una chiamata a System.IO.Directory.GetFiles per elencare i file nella directory di destinazione.
Se rimuovo l'estensione .txt in modo che Windows Explorer visualizza come "debug", allora il file viene trovato.
Risulta explorer nascondeva le estensioni dei file di tipi conosciuti sul computer di destinazione.
FYI ---------------------------------------------- ------------------
Apri Explorer, Seleziona Strumenti-> Opzioni cartella, quindi visualizzazione schede.
Scorrere verso il basso e deselezionare "Nascondi le estensioni per i tipi di file conosciuti".
Altri suggerimenti
Per assicurarsi che siete nella cartella corretta, guarda Environment.SpecialFolders
per es.
string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Poi controlla anche i permessi sul file specifico.
Vorrei anche provare ad usare
File.Exists()
prima di aprirlo. E un piccolo consiglio è di usare
Path.Combine()
Quando si combinano 2 parti di un percorso.
Forse è prefisso è sbagliato: C:\Program Files
Ad esempio, per il brasiliano installazioni portoghese di Windows la cartella diventa "C:\Arquivos de Programas\"
; si dovrebbe assicurarsi che il proprio Windows installazioni non ha lo stesso "caratteristica".
Se questo codice di esempio viene eseguito all'interno di quella cartella, si potrebbe utilizzare un percorso relativo.
Si potrebbe anche provare a utilizzare ourPath = "%ProgramFiles%\MyCompany\MyTool\
Può essere a causa di un'eccezione di sicurezza come l'utente corrente cercando di leggere non dispone di autorizzazioni sufficienti. Ho incontrato molte volte che ....