2009-11-12 3 views
8

Sto lavorando su un'applicazione per Windows 7, ed eseguire alcuni codice di creazione di directory di routine:Directory.Exists restituisce vero quando directory non è presente

string dirPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyDir");  
if (!Directory.Exists(dirPath)) 
    Directory.CreateDirectory(dirPath); 

Il problema è che la linea Directory.Exists restituisce true, quando non riesco a vedere la directory attraverso la riga di comando e Windows Explorer. Questo non è un problema quando si lavora con Windows XP. C'è qualcosa in corso con Windows 7 di cui non sono a conoscenza?

EDIT: Path.Combine

+1

Environment.GetFolderPath prende un solo argomento, che cosa è MyDir? – bobbyalex

+0

Quindi la directory MyDir è davvero lì? O è solo che non riesci a vederlo? – bobbyalex

+1

Penso che ciò che manca (che ho assunto) è una chiamata a Path.Combine che gli avrebbe fornito una sottodirectory MyDir della cartella speciale CommonApplicationData. –

risposta

11

preghiamo di comprendere che Windows Vista e Windows 7 utilizzare la virtualizzazione per proteggere tali cartelle, quindi è necessario controllare se myDir è in VirtualStore,

C: \ Users (nome utente) \ AppData \ Local \ VirtualStore \ ProgramData

+0

Per espandere su questo: se in precedenza hai provato a creare MyDir da un processo non elevato, Windows ha impostato una copia virtualizzata per te. Credo che continuerai a vedere questa copia virtualizzata anche se controlli Directory.Exists da un processo elevato. –

+0

Penso che questo sia più vicino alla risposta di cui ho bisogno, ma ho controllato in VirtualStore e non ho visto MyDir lì. Avete alcuni articoli su processi elevati? Non ho familiarità con questo concetto. –

+0

Inoltre, è possibile utilizzare Process Monitor per verificare effettivamente la cartella alla quale l'applicazione stava tentando di accedere per capire dove si trova MyDir. (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) Gioca con esso e lo troverai meraviglioso. –

0

aggiunta non so il motivo per cui Windows 7 che sta facendo, e non ho una copia di prova, ma il vostro controllo per Directory.Exists (percorso) non devono essere necessario Se rifletti (in profondità) in Directory.CreateDirectory (percorso), troverai che controlla internamente per vedere se la directory esiste già e non è un problema chiamarla più volte su una directory già esistente. La chiamata a Directory.Exists (percorso) è estranea e non necessaria.

Naturalmente, se Windows 7 non sta facendo i Directory.Exists il modo in cui mi aspetto, forse non fa la Directory.CreateDirectory nuda neanche. In ogni caso, vale la pena provare.

+0

David - Mi sono interrogato su Directory.CreateDirectory. Tuttavia, quando si esegue Directory.CreateDirectory con lo stesso percorso della cartella, la directory non viene creata. Mi rendo conto che questa è una domanda difficile a cui rispondere senza essere in grado di imitare l'ambiente, quindi potrei dover continuare a fare ulteriori ricerche. –

0

CommonApplicationData in genere si risolve in <OSDrive>\ProgramData su Windows 7. Questa è una cartella nascosta. Se non chiedete Explorer per visualizzare i file e le cartelle nascosti (dalla cartella Options-> Visualizza UI), non sarà possibile visualizzare in Explorer.

EDIT: Assicurarsi che si sta visualizzando la directory corretta in Explorer: selezionare % PROGRAMDATA%, non C: \ ProgramData.

+0

Ciao Michael - Riesco a vedere C: \ ProgramData ma non riesco a vedere la mia directory al di sotto di essa. Sono in esecuzione come amministratore, se questo è di aiuto. –

+0

Hmmm. In tal caso, non lo so. Il tuo codice funziona bene per me.Suggerisco, dato che il tuo codice copiato era errato prima della tua modifica, che lo riprovi, copiando il codice direttamente dalla tua domanda. –

+0

Potrebbe avere qualcosa a che fare con il codice in esecuzione sulla VM? Pubblicherei il codice originale, ma usa un'altra classe, quindi sarà difficile metterla insieme. –