フォルダの名前を変更することについて – プログラミング – Home

フォルダの名前を変更することについて
 
通知
すべてクリア

フォルダの名前を変更することについて


えりたまSpecial
 えりたまSpecial
(@えりたまSpecial)
ゲスト
結合: 5年前
投稿: 3
Topic starter  

お久しぶりです。えりたま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]");
   }

何卒宜しくお願いします

 


引用解決済
トピックタグ
AR2
 AR2
(@ar2)
Estimable Member
結合: 4年前
投稿: 110
 

 renameはC言語のランタイムでしたかね。
 この関数を使っていてはシェルの動作である「元に戻す」はどうやっても実現できません。

 「元に戻す」という機能を持ったリネームAPIを使用する必要があります。

 Windows7ということでCOMのIFileOperationを使用することを推奨しますが、VS2005で実現できたかな?というのは記憶にありません。(ダメだったらすみません)

 IFileOperationはShFileOperation()の後継機能で、従来よりコピーや移動などの速度が向上してたり、アンドゥがまとめられたりと色々便利な機能がたくさんあるので、調べてみると良いと思います。
(複数のファイルを一括でリネームして一発で全部アンドゥする、とかできます)


返信引用
ららら
(@admin-rarara)
メンバー Admin
結合: 5年前
投稿: 118
 

質問されていることって、
あるフォルダ名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に指定している変数をログにはいて確認。
・名前変更したいフォルダが、つかまれている。
あたりでしょうか。

 


返信引用
えりたまSpecial
 えりたまSpecial
(@えりたまSpecial)
ゲスト
結合: 10年前
投稿: 11
 

皆様のご助言ありがとう御座いました。

お二方のアドバイス参考にさせていただいて何とか解決することができました。

ありがとうございます。

ARさんのご指摘通り私のしたいことはrename関数ではできないようです。CFile::Rename関数に変えたらなぜかうまくいくようになりました。

また、管理人さんのご指摘のとおり、データベースが入っているフォルダを開いたままプログラムを実行しておりました。(フォルダ名を確認するため)

つまりエクスプローラを閉じてCFile::Rename関数を使って目的を達せられるようになった次第です。

またよろしくおねがいいたします!


ららら 件のいいね!
返信引用
仲澤@失業者
 仲澤@失業者
(@仲澤@失業者)
ゲスト
結合: 4年前
投稿: 3
 

まず、「SYSBACKUPDATAPATH = "D:\DATA\AAA";」が、

(1)文字列リテラルで、
(2)「DATA」等がフォルダ名称

であるなら、バックスラッシュ「\」が足りません。
一文字バックスラッシュ又は円記号はそれに続く文字と一体とみなされ、
「エスケープシーケンス」処理がなされてしまいます。

文字列リテラル内で一文字のバックスラッシュは「\\」の様に二つ並べて表します。
意味が分からない場合は、これに登場したキーワードでぐぐってみてください。


返信引用
えりたまSpecial
 えりたまSpecial
(@えりたまSpecial)
ゲスト
結合: 10年前
投稿: 11
 

仲澤@失業者さん えりたまSpecialです。

ご指摘ありがとう御座います。コード修正して動作確認致しました。

今後も宜しくお願い致します。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました