none
フォルダ名の変更について RRS feed

  • 質問

  • こんにちは。

    Windows 7 Home Premium
    Visual Studio 2010 Pro C#
    を使用しています。

    Directory.Move(OldFolderName, NewFolderName);

    でフォルダ名を変換したいのですが、単に大文字・小文字の変換(例えば"BOOK"から"book"へ)の場合は下記の例外エラーが発生します。
    「System.IO.IOException: ソース パスとターゲット パスを同じにすることはできません。」
    意味はわかりますが、Windowsのエクスプローラでは変更できますよね。

    このような場合は、どうやってフォルダ名を変更すればよいのでしょうか?

    よろしくお願いします。

    2010年12月23日 11:14

回答

  • ディレクトリに対するDirectory.Move() では大文字小文字を区別せずに比較するためダメですが、ファイルに対するFile.Move() はそのようなチェックを行っていないために大文字小文字の変換ができるんですね。そしてWin32 APIとしてはどちらもMoveFile() なのでディレクトリに対してFile.Move()をしてみたら…ファイルが見つからないと言われてしまいますね。

    第3の方法として

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern bool MoveFile(String src, String dst);

    かなぁ。

    • 回答としてマーク BALKAN-P 2010年12月24日 14:07
    2010年12月24日 0:32

すべての返信

  • スマートではありませんが、一度別のフォルダ名を経由して変更するくらいしか思いつきませんでした。

    例:BOOK→work→book


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
    2010年12月23日 12:41
  • Process オブジェクト使って、cmd.exe の ren コマンドを使うとか。
    2010年12月23日 12:49
  • ディレクトリに対するDirectory.Move() では大文字小文字を区別せずに比較するためダメですが、ファイルに対するFile.Move() はそのようなチェックを行っていないために大文字小文字の変換ができるんですね。そしてWin32 APIとしてはどちらもMoveFile() なのでディレクトリに対してFile.Move()をしてみたら…ファイルが見つからないと言われてしまいますね。

    第3の方法として

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern bool MoveFile(String src, String dst);

    かなぁ。

    • 回答としてマーク BALKAN-P 2010年12月24日 14:07
    2010年12月24日 0:32
  • こんにちは。

    アドバイスいただいた方法

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern bool MoveFile(String src, String dst);

    で思ったとおりに変換できました。

    でも、MoveFile関数は、移動先が違うドライブだとエラーになるそうですね?
    ちょっと面倒ですけど、Directory.Move と使い分けるようにプログラムすればなんとかなりそうです。

    どうもありがとうございました。

    2010年12月24日 14:13