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

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

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

  RSS

えりたまSpecial
 えりたまSpecial
(@えりたまSpecial)
ゲスト
参加: 2年 前
投稿: 3
2019年12月6日 6:46 AM  

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

何卒宜しくお願いします

 


引用解決済
Topic Tags
AR2
 AR2
(@ar2)
Estimable Member
参加: 10か月 前
投稿: 110
2019年12月8日 6:14 PM  

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

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

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

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


返信引用
ららら
(@admin-rarara)
メンバー Admin
参加: 1年 前
投稿: 114
2019年12月9日 2:39 PM  

質問されていることって、
あるフォルダ名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)
ゲスト
参加: 7年 前
投稿: 11
2019年12月11日 10:23 PM  

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

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

ありがとうございます。

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

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

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

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


ららら 件のいいね!
返信引用
仲澤@失業者
 仲澤@失業者
(@仲澤@失業者)
ゲスト
参加: 10か月 前
投稿: 3
2019年12月12日 4:52 PM  

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

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

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

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


返信引用
えりたまSpecial
 えりたまSpecial
(@えりたまSpecial)
ゲスト
参加: 7年 前
投稿: 11
2020年1月13日 8:28 AM  

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

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

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


返信引用

返信する

Author Name

Author Email

タイトル *

Preview 0 Revisions Saved
Share:
タイトルとURLをコピーしました