2014-06-07 9 views
5

Sto cercando di implementare un metodo di copia cartella che chiama FindFirstFile e FindNextFile in un ciclo, che può chiamarsi in modo ricorsivo su qualsiasi sottocartella.Come dire se la cartella è una sottocartella per la copia della cartella ricorsiva?

Per evitare un ciclo infinito evidente, è necessario assicurarsi che la cartella di destinazione non sia una sottocartella di una cartella di origine. La domanda è come farlo? Il mio pensiero era di tradurre un percorso DOS in un percorso specifico del dispositivo (è necessario scoprire come) ma sembra esserci di più.

Così sto testando per questa situazione:

ho creato la cartella My Documents per essere reindirizzato a una condivisione di rete per \\Server\Home\UserA\Documents, oltre a quella cartella è anche mappata all'unità R: sul computer client. Quindi questo significa che tutte le seguenti cartelle:

"R:\Documents\Subfolder1" 
"\\Server\Home\UserA\Documents\Subfolder1" 
"C:\Users\UserA\Documents\Subfolder1" 

punto di vista tecnico nella stessa posizione fisica, che è una sottocartella di My Documents.

La domanda è come sapere questo in modo affidabile?

+0

Se si sta iterando attraverso una gerarchia di cartelle, come ci si aspetta di incontrare più cartelle che si associano alla stessa cartella? A meno che non si utilizzino collegamenti simbolici o giunzioni (che possono essere rilevate entrambe durante l'iterazione). –

+0

Oh, può essere fatto facilmente senza symlinks. Dì, se specifichi 'c: \ Folder1' come cartella di origine e' c: \ Folder1 \ Folder2' come destinazione. – c00000fd

risposta

2

Utilizzare GetFileInformationByHandle per recuperare il numero di serie del volume e l'indice del file per la directory di destinazione e per ogni possibile corrispondenza. Se il numero di serie e l'indice del file sono uguali, sono la stessa directory.

Nota che è necessario utilizzare il flag FILE_FLAG_BACKUP_SEMANTICS in CreateFile per aprire un handle in una directory. (Non è necessario il privilegio di backup per farlo.)

Potrebbe essere possibile per i volumi clonati avere lo stesso numero di serie (non sono sicuro se Windows forza o meno una modifica del numero di serie) quindi potrebbe essere saggio fornire un'opzione all'utente che disabilita questo controllo.

+0

Grazie, è una buona soluzione. Sebbene quale opzione darei all'utente finale? "_ [x] Riaggancia l'app e crea un'enorme cartella sul mio disco_" :) – c00000fd

+1

* "[x] Zitto, so cosa sto facendo" * :-) Ma seriamente, la mia applicazione da riga di comando ha un'opzione '/ nofileids'. D'altra parte, io sono l'unico che lo usa, quindi non ho avuto bisogno di preoccuparmi di essere frainteso ... potresti nasconderlo in un'impostazione di registro o qualcosa del genere. In alternativa, se si desidera supportare esplicitamente questo scenario senza l'intervento dell'utente, quando viene rilevata la ricorsione possibile è possibile creare un file temporaneo con un nome univoco e vedere se viene visualizzato "sull'altro volume" o meno. –

+0

Haha. Bene. Dovrei aggiungere un "uovo di Pasqua" così. Ma, seriamente, come potrei rilevare una ricorsione in fuga? Sai, tipo di loop infinito. – c00000fd