10
votes

Répertoire de renommage avec le même nom Différent cas

J'essaie de renommer un répertoire en C # à un nom identique uniquement avec un cas différent.

Par exemple: F: \ Test sur f: \ Test

J'ai essayé ce code: xxx

et je reçois une ioexception - la source de la source et de la destination doit être différente. . J'ai aussi essayé le répertoire.move () avec le même résultat.

Comment ça fait? Dois-je créer un répertoire Temp distinct, déplacez les fichiers contenus du répertoire d'origine dans le répertoire TEMP, puis supprimez l'original et renommez le répertoire Temp?


0 commentaires

4 Réponses :


0
votes

La réponse est oui dans ce cas - le système de fichiers lui-même ne voit pas les deux comme différents, vous aurez donc besoin de supprimer et d'ajouter comme nouveau nom (ou déplacer / supprimer / déménager comme suggestion) < / p>


1 commentaires

Le système de fichiers lui-même fait. L'emballage de l'API Windows autour d'elle introduit une insensivité de cas.



1
votes

Pourquoi ne pas renommer le répertoire TEMP puis renommez à nouveau sur Test ?


0 commentaires

11
votes

Eh bien, vous n'avez pas besoin de créer un répertoire séparé et de tout déplacer. Il suffit de renommer le dossier sur quelque chose de différent puis de retour au nom que vous souhaitez:

var dir = new DirectoryInfo(@"F:\test");
dir.MoveTo(@"F:\test2");
dir.MoveTo(@"F:\TEST");


2 commentaires

Merci, cela rend beaucoup plus de sens que la façon dont j'ai décrit le faire.


En fait, bougerfileeex n'a même pas besoin de ce drapeau pour le faire; Vous pouvez même utiliser movefile , et ça fonctionne bien. C'est le BCL qui empêche le renommant, pas Win32.



4
votes

Même si la méthode .NET répertoireIfo.moveto code> jette une exception si le nom est identique, vous pouvez appeler l'API Windows mobilefile code> fonctionne comme ceci pour définir le boîtier du nom du répertoire:

[DllImport("kernel32", SetLastError = true)]
private static extern bool MoveFile(string lpExistingFileName, string lpNewFileName);


1 commentaires

Cela fonctionne bien, mais cela n'affecte que le fichier / répertoire réel et non les répertoires racines (ou le répertoire où le fichier est situé, si vous déplacez un fichier). Donc, si vous avez besoin de l'ensemble du chemin pour vous conformer au nom souhaité, vous devez faire boucle tous les répertoires de chemin d'accès à la racine et à vérifier / déplacez chacun d'eux à un nouveau nom avec la capitalisation souhaitée.