C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: フォルダの名前を変更したい


(過去ログ 166 を表示中)

[トピック内 22 記事 (1 - 20 表示)]  << 0 | 1 >>

■95924 / inTopicNo.1)  フォルダの名前を変更したい
  
□投稿者/ グルメン (4回)-(2020/10/09(Fri) 14:01:42)

分類:[C#] 

Windowsのエクスプローラでフォルダまたはそのフォルダのサブフォルダを開いている時に、
プログラムでフォルダの名前を変更すると、System.IO.IOException がスローされてしまいます。
名前を変更する方法はないでしょうか?
引用返信 編集キー/
■95927 / inTopicNo.2)  Re[1]: フォルダの名前を変更したい
□投稿者/ ぶなっぷ (248回)-(2020/10/09(Fri) 15:43:54)
やってみると分かりますが、エクスプローラ自身でも名前の変更に失敗します。
Microsoftができないことが、ユーザの我々にできる気がしません。

あと。。。
そもそも、やってほしくないからガードしてるわけで、
正直、変更できてしまう方が問題がある気がします。

なので、System.IO.IOExceptionの内容を確認して、
「対象フォルダを開いているから」
が原因なら、

メッセージボックスなどで、
「xxxフォルダが開かれているため名前を変更できません、閉じてください。」
などとユーザに促すのが筋だと思います。

引用返信 編集キー/
■95928 / inTopicNo.3)  Re[2]: フォルダの名前を変更したい
□投稿者/ グルメン (5回)-(2020/10/09(Fri) 15:52:59)
No95927 (ぶなっぷ さん) に返信

回答ありがとうございます。

> やってみると分かりますが、エクスプローラ自身でも名前の変更に失敗します。
> Microsoftができないことが、ユーザの我々にできる気がしません。
エクスプローラではできます!
フォルダ下にあるファイルをアクセス中には、当然のごとくフォルダの名前は変更できないですが、
フォルダ下のファイルにアクセスしていなければ、フォルダの名前は変更は可能です。

引用返信 編集キー/
■95930 / inTopicNo.4)  Re[3]: フォルダの名前を変更したい
□投稿者/ 魔界の仮面弁士 (2866回)-(2020/10/09(Fri) 17:07:53)
No95928 (グルメン さん) に返信
> フォルダ下にあるファイルをアクセス中には、当然のごとくフォルダの名前は変更できないですが、
> フォルダ下のファイルにアクセスしていなければ、フォルダの名前は変更は可能です。

エクスプローラー オプションの [別のプロセスでフォルダー ウィンドウを開く]の影響も受けそうですが、それはさておき。

エクスプローラーを何とかしたいということであれば、
ShellWindows を列挙して、該当のフォルダーを開いているエクスプローラーを特定し、
別の場所(デスクトップ)を開かせるために Navigate2 メソッドを呼んでみるとか、
あるいは、Quit メソッドで該当エクスプローラーを閉じてしまうのはどうでしょう?
引用返信 編集キー/
■95932 / inTopicNo.5)  Re[4]: フォルダの名前を変更したい
□投稿者/ グルメン (6回)-(2020/10/09(Fri) 17:30:25)
No95930 (魔界の仮面弁士 さん) に返信

回答ありがとうございます。

>フォルダ下にあるファイルをアクセス中には、当然のごとくフォルダの名前は変更できないですが、
>フォルダ下のファイルにアクセスしていなければ、フォルダの名前は変更は可能です。
この内容は、「ぶなっぷ」さんへのエクスプローラ自身での動作に言及したまでです。

エクスプローラを何とかしたいというわけではなく、
あくまで、エクスプローラでフォルダを開いている状態でも、
C#プログラムでフォルダの名前を変更したいのです。

引用返信 編集キー/
■95933 / inTopicNo.6)  Re[5]: フォルダの名前を変更したい
□投稿者/ 魔界の仮面弁士 (2867回)-(2020/10/09(Fri) 18:52:42)
No95932 (グルメン さん) に返信
> エクスプローラを何とかしたいというわけではなく、

何れかのプロセスによって、カレントディレクトリとして割り当てられていると、
そのディレクトリの名前を変更することはできません。

また、エクスプローラーと C# の立場が逆であったとしても同じことです。


たとえば、C# のアプリから、
  System.IO.Directory.SetCurrentDirectory(@"D:\Example\");
  System.IO.Directory.Move(@"D:\Example\", @"D:\Example2\");
という操作をした場合、Move メソッドは IOException となるでしょう。


上記で D:\Example\ をカレントディレクトリとしている最中は、
エクスプローラーからであっても、リネーム操作ができなくなります。


しかし、カレントディレクトリを別の場所にしてやれば、
そのディレクトリの名前を変更できるようになります。
 System.IO.Directory.SetCurrentDirectory(@"D:\");
 System.IO.Directory.Move(@"D:\Example\", @"D:\Example2\");


上記は、.NET の Directory.SetCurrentDirectory を例に挙げましたが、
コマンドプロンプトから
 CD /D D:\Example
としていた場合も同様にロックされます。


カレントディレクトリは、それぞれのアプリごとに存在していますので、
解放したいなら、そのディレクトリを掴んでいる該当アプリを操作して
カレントディレクトリを変更させるか、あるいはそのプロセスを
終了させる必要があると思います。
引用返信 編集キー/
■95944 / inTopicNo.7)  Re[6]: フォルダの名前を変更したい
□投稿者/ グルメン (7回)-(2020/10/12(Mon) 09:46:29)
No95933 (魔界の仮面弁士 さん) に返信

> カレントディレクトリは、それぞれのアプリごとに存在していますので、
> 解放したいなら、そのディレクトリを掴んでいる該当アプリを操作して
> カレントディレクトリを変更させるか、あるいはそのプロセスを
> 終了させる必要があると思います。

それでは、エクスプローラを操作してカレントディレクトリを変更させる方法は、
どうすればいいですか?
引用返信 編集キー/
■95948 / inTopicNo.8)  Re[7]: フォルダの名前を変更したい
□投稿者/ 魔界の仮面弁士 (2869回)-(2020/10/12(Mon) 11:55:25)
No95944 (グルメン さん) に返信
> それでは、エクスプローラを操作してカレントディレクトリを変更させる方法は、
> どうすればいいですか?

手順そのものは No95930 で述べています。

しかし、エクスプローラー以外がそのディレクトリを掴んでいる可能性も
あるわけですから、所詮はいたちごっこになってしまうと思いますよ。
引用返信 編集キー/
■95950 / inTopicNo.9)  Re[8]: フォルダの名前を変更したい
□投稿者/ グルメン (8回)-(2020/10/12(Mon) 15:13:07)
No95948 (魔界の仮面弁士 さん) に返信

No95930 がそうでしたか。
2度手間で、すみませんでした。

> しかし、エクスプローラー以外がそのディレクトリを掴んでいる可能性も
> あるわけですから、所詮はいたちごっこになってしまうと思いますよ。
それはそうかもしれませんが...
引用返信 編集キー/
■95955 / inTopicNo.10)  Re[9]: フォルダの名前を変更したい
□投稿者/ pixer (2回)-(2020/10/13(Tue) 11:27:32)
フォルダーだけでなく、フォルダーの中のファイルが使用中であっても
そのフォルダ―の名前変更・削除はできません。
なので、他のプロセスで使用中のものであれば、
使用中のプロセスを終了するしか方法はありません。
これはどうしようもない事実なので、
他の運用で対応することを考えたほうが賢明です。
引用返信 編集キー/
■95961 / inTopicNo.11)  Re[10]: フォルダの名前を変更したい
□投稿者/ 774RR (834回)-(2020/10/13(Tue) 14:50:34)
インストーラでよくある選択肢は、更新対象ソフトが起動済みなら
「閉じてから再試行」「強制更新(再起動が必要)」「キャンセル」
なのでこれに準じてみるとか。

たかだかリネームごときで再起動が必要ってのはあり得ないので
「開いているソフトを閉じてから再試行」「キャンセル」
で十分かと。
引用返信 編集キー/
■95965 / inTopicNo.12)  Re[10]: フォルダの名前を変更したい
□投稿者/ グルメン (9回)-(2020/10/13(Tue) 18:23:37)
No95955 (pixer さん) に返信

回答ありがとうございます。

> フォルダーだけでなく、フォルダーの中のファイルが使用中であっても
> そのフォルダ―の名前変更・削除はできません。
> なので、他のプロセスで使用中のものであれば、
> 使用中のプロセスを終了するしか方法はありません。
> これはどうしようもない事実なので、
> 他の運用で対応することを考えたほうが賢明です。
フォルダーの中のファイルが使用中の場合は、その通りとは思いますが、
エクスプローラーで変更したいフォルダが展開されているのみで、
フォルダの名前が変更できないのは、いかがなものかと思っております。
引用返信 編集キー/
■95966 / inTopicNo.13)  Re[11]: フォルダの名前を変更したい
□投稿者/ グルメン (10回)-(2020/10/13(Tue) 18:27:02)
No95961 (774RR さん) に返信

回答ありがとうございます。

> インストーラでよくある選択肢は、更新対象ソフトが起動済みなら
> 「閉じてから再試行」「強制更新(再起動が必要)」「キャンセル」
> なのでこれに準じてみるとか。
>
> たかだかリネームごときで再起動が必要ってのはあり得ないので
> 「開いているソフトを閉じてから再試行」「キャンセル」
> で十分かと。
フォルダーの中のファイルが使用中の場合は、それでもいいのですが、

■95965 と同様で、
エクスプローラーで変更したいフォルダが展開されているのみで、
フォルダの名前が変更できないのは、いかがなものかと思っております。






引用返信 編集キー/
■95967 / inTopicNo.14)  Re[12]: フォルダの名前を変更したい
□投稿者/ 魔界の仮面弁士 (2871回)-(2020/10/13(Tue) 18:58:13)
No95966 (グルメン さん) に返信
> エクスプローラーで変更したいフォルダが展開されているのみで、
> フォルダの名前が変更できないのは、いかがなものかと思っております。

結論は変わらないと思いますよ。


案1) MessageBoxButtons.RetryCancel (あるいは AbortRetryIgnore) を表示して、
  ユーザー操作にて該当アプリ(エクスプローラー)を操作させる。

案2) Explorer への限定対応として、 No95930 の処理を実装する。
引用返信 編集キー/
■95968 / inTopicNo.15)  Re[3]: フォルダの名前を変更したい
□投稿者/ furu (74回)-(2020/10/13(Tue) 19:42:48)
No95928 (グルメン さん) に返信
> ■No95927 (ぶなっぷ さん) に返信
> エクスプローラではできます!

ほんと、エクスプローラや他のファイラではできました。

なので
エクスプローラと同じことをやればいいのでは
ないでしょうか?

試していませんが

shell32.dllのSHFileOperationとか
Microsoft.VisualBasic.FileIOのFileSystem.MoveDirectoryでUIOption指定

でできないかな。
引用返信 編集キー/
■95969 / inTopicNo.16)  Re[11]: フォルダの名前を変更したい
□投稿者/ 774RR (835回)-(2020/10/13(Tue) 19:45:39)
1ユーザーとしては自分の操作で開いているエクスプローラ画面をプログラムが勝手に閉じちゃうほうが罪が重いッス
表示しているディレクトリが変わるのは閉じるよりはマシだけど有罪には間違いない
「たかだかエクスプローラ画面が開いているだけで」なんて口が裂けても言えないッス
# 社内共有サーバのディレクトリの深いところまでファイル探しに行って勝手に閉じられたら/表示位置が変わったら激怒モンっす。

Windows10 Pro x64 だけど、エクスプローラで d:\pdf を表示しているとき
別エクスプローラで d:\ を開いて名前の変更で d:\pdfs にリネームしたらできる様子

引用返信 編集キー/
■95971 / inTopicNo.17)  Re[12]: フォルダの名前を変更したい
□投稿者/ furu (76回)-(2020/10/13(Tue) 20:02:23)
No95969 (774RR さん) に返信
> # 社内共有サーバのディレクトリの深いところまでファイル探しに行って勝手に閉じられたら/表示位置が変わったら激怒モンっす。
>
> Windows10 Pro x64 だけど、エクスプローラで d:\pdf を表示しているとき
> 別エクスプローラで d:\ を開いて名前の変更で d:\pdfs にリネームしたらできる様子
>
名前変更なら、閉じたり表示位置もかわらないのでいいと思います。
実際、エクスプローラがそうしているし、
変えられたエクスプローラも瞬時に表示し直しているので。
引用返信 編集キー/
■95972 / inTopicNo.18)  フォルダの名前を変更したい
□投稿者/ ぶなっぷ (251回)-(2020/10/14(Wed) 08:48:55)
2020/10/14(Wed) 08:49:58 編集(投稿者)
識者の人たちに任せようかとも思いましたが、いろいろな話が出てきたので
整理させてください。

まず、基本的には、
・エクスプローラでも開いているフォルダの名前変更はできる

私が勘違いしたのは、
・カレントディレクトリのフォルダの名前変更はできない
に引っかかったせいだと思われます。

で、「カレントディレクトリの罠」に引っかかった場合にどうするか?
 1) カレントディレクトリを変更
 2) そのカレントディレクトリをつかんでいるプロセスを終了

1), 2)どっちにするにしても、ユーザの意思を聞かずに勝手にやってしまうのは
問題な気がします。
なんらかのメッセージを表示するべきだと思います。

引用返信 編集キー/
■95974 / inTopicNo.19)  Re[5]: フォルダの名前を変更したい
□投稿者/ ぶなっぷ (252回)-(2020/10/14(Wed) 08:53:36)
ごめん、最初の疑問に答えてなかった(;^_^A

もしかして、
> ・カレントディレクトリのフォルダの名前変更はできない
に引っかかっていませんか?

私のところでやったら、
  Directory.Move(string、string);
で開いているフォルダの名前変更できましたよ(^^)

引用返信 編集キー/
■95979 / inTopicNo.20)  Re[6]: フォルダの名前を変更したい
 
□投稿者/ furu (77回)-(2020/10/14(Wed) 10:15:24)
No95974 (ぶなっぷ さん) に返信
> 私のところでやったら、
> Directory.Move(string、string);
> で開いているフォルダの名前変更できましたよ(^^)
下位のフォルダ開いて
別エクスプローラで上位のフォルダ名変えられたけど
Directory.Moveではできなかった。
昨日何回か試したんだけど、勘違いだったかな。

SHFileOperationは
エラーの場合メッセージ表示できるから
アクセス権調べないでフォルダ名変更に
いってる気がする。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -