【ファイル・フォルダ操作】パスが長すぎて削除できないとき【覚書】

先日、とあるプラグインを使用中のソフトにインストールしようとしたところ、ソフトがフリーズ(正確には違うけど)した。その後、プラグインをインストールしようとしたフォルダを確認したのだけれど、エクスプローラ上からは確認できないくらいに同名のフォルダが作成されていた。

 

どんな状態だったかというと、

C:\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge
\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge\
hoge\hoge\hoge\hoge\……(最後を確認できず)

といった感じ。

 

予期せぬ状態なので、これを削除しようとしても削除はできず、パスが長いというのでフォルダ名を短くしても、その分、新たなフォルダを読み込んでしまい、エクスプローラが非常に重くなる……という始末で手に負えなかった。

で、ネットで検索(検索用語:フォルダ 削除 長すぎ(深すぎ) 削除)をかけてみると、同様の症状でヒットするページが幾つかあり、その中にMSのサポートもあった。

 

 

どうやらWindowsで使用可能なMAX_PAHTの値を超過してしまっているらしい。対応策としては幾つか記載されていて、読み込める一番下のフォルダを共有にしたり、ネットワークドライブに設定したりして、他のPCやタブレット等から削除したり、一番下のフォルダを同じドライブの別のフォルダ(フォルダ名が異なる場所)に移動して、上の部分を削除したり……といった方法があった。

記載されている幾つかの方法で確かに一部のフォルダを削除できたものの、残念ながらループ処理で作成されてしまったフォルダは多すぎて、余りにも時間がかかり、どれも有効な手段にはならなかった。また、ツールを使った削除にしても、有効的な処理をしてくれるフリーソフトは見つからず、完全にお手上げ。

どうしたものかと悩んでいたところ、javaで書かれた再帰的にフォルダやファイルを削除してくれるコードが公開されていて、それを試してみたところ、今までの苦労は何だったのか……というほどに簡単に処理してくれた。ありがたや~ありがたや~。

Javaでディレクトリ(サブフォルダやファイルを含む)を削除してくれるコード

引用元:Javaでディレクトリを確実に削除するコード - my-notebook

static public void main(String[] args){
         delete(new File(“mydir”));
}

static private void delete(File f){
         if(f.exists()==false){
                 return ;
         }

         if(f.isFile()){
                  f.delete();
         } 

         if(f.isDirectory()){
                  File[] files = f.listFiles();
                  for(int i=0; i<files.length; i++){
                             delete(files[i]);
                   }
                   f.delete();
         }
}

※ 動作にはJavaの動く環境が必要。また、コンパイルされていないので、実行するにはコンパイルする必要あり。『 “ 』で囲まれたmydirの部分を、削除したいパスと入れ替えて実行してやる。

※ 消したいフォルダ(ディレクトリ)のパスが『E:\hoge\hoge2』だったら、mydirには『E:\\hoge\\hoge2』とする。

まとめ

今回はネットで検索して出てきた結果通りにフォルダの共有やネットワークドライブ化、フリーソフトの使用を試してみたものの、サブフォルダ数が膨大に作られていたためにその効果は今ひとつだった。

上記のコードを使用するには、.Javaのファイルをコンパイルできる環境が必要だけど、その手のフリーソフトでもエラーが出て不可だったフォルダの削除が簡単にできるので、Javaの開発環境が既にあるのであれば、非常にオススメ。

まあ、プログラミングできる人は自分で簡単にソースが書けるので、あれかもしれないけど。ただ、フォルダの削除にあれこれと時間を費やす(いろいろな方法を試したり、手動で削除を試みたり)のであれば、プログラミングを学ぶひとつの機会として、Javaでプログラミングできる環境を整えてみるのもいいかもしれない。

ちなみにプログラミングができなくても、大抵の解説サイトの初期にある『導入』と『Hello Worldの表示』の部分まで進めば、上のコードを使ってコンパイル・実行するだけなので、総合的に必要な時間は少なくなる……はず。

 

 

関連記事
スポンサーサイト

0 Comments

Post a comment