お久しぶりです。えりたまSpecialです。
環境は
Win7Professional
VC2005
です。
フォルダの名前を変更してまた元に戻すことをしたいのですがうまくいくときもあればいかないときもあります。その理由がよくわからないのです。
SYSBACKUPDATAPATH = "D:\DATA\AAA";
SYSBACKUPDATABUFPATH = "D:\DATA\AAA_BACKUP";
CString FolderNameFrom;
CString BackupFolderName;
FolderNameFrom.Format("%s",SYSBACKUPDATAPATH);
BackupFolderName.Format("%s",SYSBACKUPDATABUFPATH);
if (rename(FolderNameFrom, BackupFolderName) != 0) {
AfxMessageBox("フォルダ名変更失敗[0]");
}
何卒宜しくお願いします
renameはC言語のランタイムでしたかね。
この関数を使っていてはシェルの動作である「元に戻す」はどうやっても実現できません。
「元に戻す」という機能を持ったリネームAPIを使用する必要があります。
Windows7ということでCOMのIFileOperationを使用することを推奨しますが、VS2005で実現できたかな?というのは記憶にありません。(ダメだったらすみません)
IFileOperationはShFileOperation()の後継機能で、従来よりコピーや移動などの速度が向上してたり、アンドゥがまとめられたりと色々便利な機能がたくさんあるので、調べてみると良いと思います。
(複数のファイルを一括でリネームして一発で全部アンドゥする、とかできます)
質問されていることって、
あるフォルダ名Aを、Bに変更する。
何か処理をする
フォルダ名BをAに変更するですかね?
であれば、renameで出来ないですかね。
何かしらの原因で失敗していると思うので、
errnoの番号で原因わからないでしょうか。
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/rename-wrename?view=vs-2019
if (rename(a, b) != 0) {
printf("%d", errno);
}
ありそうなのは、
・正しいフォルダ名を指定しているつもりがバグがあった。→renameに指定している変数をログにはいて確認。
・名前変更したいフォルダが、つかまれている。
あたりでしょうか。
皆様のご助言ありがとう御座いました。
お二方のアドバイス参考にさせていただいて何とか解決することができました。
ありがとうございます。
ARさんのご指摘通り私のしたいことはrename関数ではできないようです。CFile::Rename関数に変えたらなぜかうまくいくようになりました。
また、管理人さんのご指摘のとおり、データベースが入っているフォルダを開いたままプログラムを実行しておりました。(フォルダ名を確認するため)
つまりエクスプローラを閉じてCFile::Rename関数を使って目的を達せられるようになった次第です。
またよろしくおねがいいたします!
まず、「SYSBACKUPDATAPATH = "D:\DATA\AAA";」が、
(1)文字列リテラルで、
(2)「DATA」等がフォルダ名称
であるなら、バックスラッシュ「\」が足りません。
一文字バックスラッシュ又は円記号はそれに続く文字と一体とみなされ、
「エスケープシーケンス」処理がなされてしまいます。
文字列リテラル内で一文字のバックスラッシュは「\\」の様に二つ並べて表します。
意味が分からない場合は、これに登場したキーワードでぐぐってみてください。
仲澤@失業者さん えりたまSpecialです。
ご指摘ありがとう御座います。コード修正して動作確認致しました。
今後も宜しくお願い致します。