2009-10-26 20 views
8

私は、C#のディレクトリの名前を大文字と小文字の区別なく同じ名前に変更しようとしています。例えば異なる名前の同じ名前のディレクトリの名前を変更する

: F:Fに\テスト:私はこのコードを試してみました\ TEST

var directory = new DirectoryInfo("f:\\test"); 
directory.MoveTo("f:\\TEST"); 

と私はIOExceptionを取得する - ソースと宛先パスが異なっている必要があります。私はDirectory.Move()と同じ結果を試してみました。

これはどのように行われますか?別の一時ディレクトリを作成し、含まれているファイルを元のディレクトリから一時ディレクトリに移動して元のファイルを削除し、一時ディレクトリの名前を変更する必要がありますか?

答えて

11

まあ、別のディレクトリを作成してすべてを移動する必要はありません。戻ったばかりのあなたが名前にし、別の何かにフォルダの名前を変更し、:

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

ありがとう、それは私がそれをやって説明した方法よりも多くの意味があります。 – scott

+2

実際、 'MoveFileEx'はそのフラグを必要としません。あなたは 'MoveFile'を使うことさえできますし、うまく動作します。 Win32ではなく、名前の変更を禁止するのはBCLで​​す。 –

-1

この場合、答えは「はい」です。ファイルシステム自体では2つのファイルが異なるとは見えないので、新しい名前として削除して追加する必要があります(または移動/削除/移動してください)

+5

ファイルシステム自体はありません。 Windows APIラッパーは大文字と小文字を区別しません。 – Joey

1

ディレクトリ名をtempに変更し、再度名前をTESTに変更してみませんか?

0

を.NETメソッドDirectoryInfo.MoveToは、名前が同じであれば、あなたはこのような、WindowsのAPI MoveFile関数を呼び出すことができます例外をスローした場合でもこのextern宣言で

bool success = MoveFile(dirInfo.FullName, dirInfo.FullName); 

:ディレクトリ名のケースを設定したときに目

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

はそれは私のために正常に動作します名前は大文字と小文字が区別されます。私は、名前がすでに指定されている通りになったときに、このように呼び出すようには試みていません。

これは、ディレクトリが元の名前では決して消えないという利点があります。

ただし、Windows上でのみ動作するという欠点があります。

関連する問題