お世話になります。
VC++/CLI
Windowsのゴミ箱のような機能を作成しておりあるフォルダ内のファイル、フォルダを別
のフォルダへ移動するプログラムを作成していますがファイル、フォルダの移動につい
て教えてください。
フォルダの移動は
System.IO.Directory.Move(C:\Test, C:\Test2);
としていますが上記の場合、移動先のC:\Test2というフォルダがすでに存在していると
例外が発生してしまいます。存在していなければ新規で作成されてC:\Testの中身が移動
されるのですが・・・。
今回、実現したいことは、既に存在するフォルダ(C:\Test2)にフォルダの中身ではなく
フォルダごと移動させたいのですが上記のコードでは実現不可でしょうか?
また、フォルダの移動だけではなくファイルもフォルダへ移動させたいのですがファイ
ルとフォルダを識別せず別フォルダへ移動できるようなクラス等はありますでしょう
か?
Win APIのSHFileOperationを直接呼ぶとか。
(.NET FrameworkにはSHFileOperationの機能はないらしい)
SHFILEOPSTRUCT構造体でLPCTSTR型が必要なのですが、Unicodeビルド(デフォルト)であ
ればPtrToStringCharsを使えばString^型変数からも取得できます。
(C++なので、C#やVBみたいにDllImportを使う必要はないです)
ただの移動ですよね?やりたいのはこういうことなのでは。
System::IO::Directory::Move(C:\\Test, C:\\Test2\\Test);
#SHFileOperationのような機能もあったりします。
http://www.atmarkit.co.jp/fdotnet/dotnettips/414progresscopy/progresscopy.html
>#SHFileOperationのような機能もあったりします。
# 中さんの
# http://blogs.wankuma.com/naka/archive/2004/05/15/2654.aspx
# だけみてないかと思っていました。
# http://blogs.wankuma.com/naka/archive/2005/05/14/11369.aspx
# というエントリもあったわけね。
# わんくまメンバ失格やな。。。orz
Blueさん
>>Win APIのSHFileOperationを直接呼ぶとか
ありがとうございます。やはりAPIを呼ぶ以外に方法はなさそうですか・・・。
GetPrivateProfileStringのように引数を渡すだけで使用出来るのでしょうか?おはずか
しいことにAPIはGetPrivateProfileStringしか使用したことがないもので・・・。MSDN
等も見ましたが英語で分かりづらくサンプルソースもなくて他サイトも調べていますが
時間がかかっています。
subaruさん
>>ただの移動ですよね?やりたいのはこういうことなのでは。
>>System::IO::Directory::Move(C:\\Test, C:\\Test2\\Test);
ありがとうございます。はい、やりたいことはただのファイルとフォルダ移動だけで
す。Windowsのファイル、フォルダ移動と同じことがしたいのです。
>>>ただの移動ですよね?やりたいのはこういうことなのでは。
>>>System::IO::Directory::Move(C:\\Test, C:\\Test2\\Test);
>
>ありがとうございます。はい、やりたいことはただのファイルとフォルダ移動だけで
>す。Windowsのファイル、フォルダ移動と同じことがしたいのです。
単に移動先の指定が間違っているだけでしょうと言いたかったのです。
移動するときにUIが必要、または移動ではなくてフォルダごとコピーしたい
という場合にはリンク先を見てねってことです。
subaruさん
>>#SHFileOperationのような機能もあったりします。
>> http://www.atmarkit.co.jp/fdotnet/dotnettips/414progresscopy/progresscopy.htm
>>l
こちらのサイトに記載されていた方法で検討しておりますがテストプログラムがおかし
な動きをしてしまいます。
以下テストプログラムです。
using namespace Microsoft::VisualBasic::FileIO;
String^ copyDest = C:\\test;
String^ moveDest = C:\\test2;
FileSystem::MoveDirectory(copyDest,moveDest);
としてボタン押下の処理で上記のコードを書いたのですが実行時にCドライブ直下のtest
フォルダはあたかも移動されたかのように消えるのですが肝心のtest2フォルダに移動さ
れてません。消えてしまったtestがどこに移動されてしまったのか行方が分からない状
況です。上記のコードに何かいかしなことはありますでしょうか
?
訂正
>>上記のコードに何かいかしなことはありますでしょうか
>>?
上記のコードに何かおかしな箇所はありますでしょうか?
>>System::IO::Directory::Move(C:\\Test, C:\\Test2\\Test);
う~ん、上記と一緒の原因のようでした・・・。
FileSystem::MoveDirectory(C:\test,C:\test2);
上記だとC:test2フォルダ直下にC:\testの中身が移動されるという認識みたい
です。