ちょっと気になったので質問します。( 趣味でC++やっています。 )
前提としてOSは Windowsオンリーとさせて頂きます。( 他のOSの方もご回答されてもいいですが、
Windows上の話だと思うので指定させて頂きます。 バージョンは開発時は Win10で 使用は Win7もあり得ます。 )
Qtの QFile::rename() を使って ディレクトリを丸ごと移動したいと思っています。
関数名とやりたいことがアレなため、ラップして
C++
1namespace FileDirectory{ 2 bool MoveDir( const QString &fromDirpath, const QString &toDirpath ){ 3 return QFile::rename( fromDirpath, toDirpath ); 4 } 5 6 bool Exists( const QString &path ){ 7 // 省略。パスが存在すればtrueを返す。それ以外ならfalse 8 } 9}
としています。
このFileDirectory::MoveDir関数 ( 元は QFile::rename関数 ) を呼び出してディレクトリ丸ごと移動したいと思っています。
で、ここまではいいのですが、なぜかパーティション? っていうのでしょうか? ドライブが違うと常に失敗します。
C++
1// main関数等のような呼び出し元だとして 2 3QString from = "C:/移動元/jazz/hello"; 4QString to = "D:/移動先/pops"; 5 6if( FileDirectory::Exists( from ) ){ 7 // 「from + " exists"」と印字する 8} 9 10if( FileDirectory::Exists( to ) ){ 11 // 「to + " exists"」と印字する 12} 13 14if( FileDirectory::MoveDir( from, to ) ){ 15 // "Succeeded!" を印字 16}else{ 17 // "Failed!" を印字 18}
のような状態にしています。
( ディレクトリパスは適当。 )
※ 注: 前提として実行ファイルを動かすときは確実にパスが正しいものとします。toはQtの関数を使うときは新規ディレクトリとしてやっています。
その上、移動先ディレクトリはCドライブとDドライブの構成(ドライブ以外の新規ディレクトリまでのパス)は完全に同じであり、
単にドライブ名をC -> Dにしただけとします。また、Dドライブ及びCドライブは存在するものとします。
つまり、ドライブ名以外は完全に同じであり、移動元が無いなどのような「どうやっても失敗する」タイプではないとします。
少なくともDドライブになっているQString fromのパスをCドライブに変えると成功することから、今回の質問に。
( ソースコードのようには証明できないことと、外出先から質問しているので証明はできませんが。 )
これを動かすと Exists系のやつがfrom が true で to が falseになっています。
でFileDirectory::MoveDir関数の結果としては "Failed!" が印字されます。
その(最終的な)パス(つまりtoか。)を確認しても「存在しません」。
で、これの QString to の ドライブ名を Dドライブから Cドライブに変えると (つまり移動元,移動先は同じドライブになる)
"Succeeded!" と印字されて toのパスを実際にチェックすると移動が完了しています。
一応、今作っている作品は自分用で、同じドライブからしか...でも問題ないのでいいですが、
USBとかに入れて使っていて、Cドライブとかの他のドライブに移動したい場合はそのソフトが入っているディレクトリ一式をCドライブに移動しないと
いけないので面倒です。
これってどうにかできませんか?
最近 ( と言っても3か月以上も前かな? ) PCを買い換えて Win10にしたところ、
Cドライブ直下にファイルは置けなくなってしまいました。
( セキュリティ面の問題を回避するためだろうけど。 )
そういう風にセキュリティ面で問題だからあえて「ドライブ間の移動は不可能」にしてあるのでしょうか?
できれば プログラマ(私)だけでどうにか出来たらいいのですが...
(例えば 第三引数として 「ドライブ間の移動やコピー等を許可する」とかみたいにするとか、
ロケール設定みたいに 「ドライブ間の移動やコピー等を許可する」関数を動かす -> 実際に移動したりする みたいに。 )
ちなみに JScript ( WSH ) ( WSFで。 ) で
JavaScript
1function FileDir(){ 2 var sf = new ActiveXObject( "Scripting.FileSystemObject" ); 3 var sh = new ActiveXObject( "WScript.Shell" ); 4 var sa = new ActiveXObject( "Shell.Application" ); 5 6 this.moveDir = function( dirpath1, dirpath2 ){ 7 sf.MoveFolder( dirpath1, dirpath2 ); 8 } 9}
のようにして試してみましたが、C++&Qtのときと同じようにしても大体同じ結果でした。
JScriptでうまく行くなら最悪、C++&Qtのプロセス起動系のやつとかでJScriptにコマンドライン引数として渡して...とできますが、
JScriptでも同じだったので...
どのようにすればいいのでしょうか?
[情報]
言語: C++ ( C++11 )
コンパイラ: MinGW
Qt: Qt 5.6 (LGPL)
OS: Windows (開発自体はWin10で使用はWin10,Win7,WinXPの場合もある。他OSは考慮しない。)
宜しくお願い致します。
[コメントとして追記]
皆様、ご回答ありがとうございます。
皆様の回答どれもよかったのですが、具体策を提示されたcatsforepawさんの回答をベストアンサーとします。
ご協力ありがとうございます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/19 10:26