いつもお世話になっております。
まると申します。
WinMe、VC++6.0、SDKで開発してます。
今回はCopyFileについて質問させていただきます。
CDドライブ(Dドライブ)からEXEを走らせて、
Dドライブ中のファイルをWindowsのSystemフォルダの下にコピーしたいのですが、
ファイルのパスは間違っていないのにCopyFileでエラーが発生してしまいます。
(CopyFile(orgFILE,destFile,FALSE)としています。)
CopyFile関数でSystemフォルダにコピーする時に、
コピー先のアクセス権などが必要なのでしょうか?
(ちなみに、Win2000では問題なく動作します)
なにか情報をお持ちでしたらお教え願います。
以上、よろしくお願い致します。
アクセス権という観点は否定できませんが、
まずは発生しているエラーの種類を特定しましょう。
CopyFile()が失敗したとき、GetLastError()で調べられるのですから。
>Sugarさん
今回もお返事いただきありがとうございます。
そして、エラーの種類を書き忘れておりました。
すみません。
改めて、エラーの種類ですが、「アクセスが拒否されました」というエラーです。
なので、アクセス権が関係あるのかも?と思った次第です。
よろしくお願い致します。
次のパターンを試してみましょう。
・CDドライブから、特殊フォルダではない任意のフォルダへのファイルコピー
・特殊フォルダではない任意のフォルダからSystemフォルダへのファイルコピー
・CDドライブから、Systemフォルダへのファイルコピー
(ただし、ファイルの指定は変数ではなくリテラル指定)
それとも、コピー先に読取専用の同名ファイルがあったりします?
WinMeを使用ですか...
私はあまり関わった経験がないですが、95系列のWindowsOSですよね、
NT張りのアクセス権限なんてありましたっけ??>どなたか識者の方
Win MEはFATだから基本的にアクセス権なんて概念ないと思うのですが……。
それはともかく,コピーをコマンドラインからおこなったらどうなります?
単純にファイルが開かれていたりして読み書きできないのでは?
推測ですが・・・
ひょっとして使用中のDLLを上書きコピーしようとしていませんか・・
コードを示したほうが明確な回答が得られると思いますが・・
sugarさん、YuOさん、不良PGさん、お返事ありがとうございます!!
>sugarさん
コピー先には同名ファイルはありません。
一度Tempフォルダにコピーしてから、Systemフォルダに書き込もうと試みましたが、
Tempフォルダへのコピーも失敗しました。
Tempも特殊フォルダに入るのでしょうか?
>YuOさん
アクセス権の概念は無いことについて、私も同感なのです。
DOSのコピーコマンドからは正常にコピーできます。
ファイルを使用する以前にエラーが出るので、読み書きできないという事はなさそうです。
>不良PGさん
おっしゃる通り、DLLファイルをコピーしようとしています。
しかし、上書きではないので、使用中というのも考えられません。
不良PGさんがおっしゃる通り、簡略化したコードを書かせていただきます。
GetSystemDirectory(SysDir,MAX_PATH);
GetCurrentDirectory(MAX_PATH,SetupDir);
lstrcat(SysDir,TEXT(\\test.dll);
lstrcat(SetupDir,TEXT(\\test.dll);
bRet=CopyFile(SetupDir,SysDir,FALSE);
一番不思議な所は、フロッピーやCDドライブからEXEを実行すると失敗(アクセス拒否)
するが、その内容をハードディスク上(デスクトップなど)にそのままコピーしてきて
EXEを実行すると成功するという点です。
更にこのバグを追いかけてみます。
皆様、お返事いただき本当にありがとうございました。
心当たりや、もしかしたら?ということがありましたら、
またご教授いただけると嬉しいです。
> GetCurrentDirectory(MAX_PATH,SetupDir);
GetCurrentDirectoryに限らず、ディレクトリを得るAPIは、
ドライブ直下では、C:\ のように末尾に'\'が付き、
それ以外では、C:\Windows\system のように末尾に'\'が付きません。
> lstrcat(SetupDir,TEXT(\\test.dll);
よって、このように単純な文字列連結を行ってはいけません。
>dairygoodsさん
GetCurrentDirectory関数で、末尾に”¥”が付くかどうか知りませんでした。
おっしゃる通りに考えると、きっとその判断の所為でコピー元ディレクトリに
アクセスできない可能性があります。
アクセス拒否のエラーメッセージを見てCopyFile関数で失敗したので、
ついコピーに失敗しているものだと思っていました。
その判断を追加して試してみたいと思います。
関数の使い方の間違いだったとしたら、本当に申し訳ありませんでした。
実際に上記のコーディングでダメだったら、また改めて質問させていただきます。
皆様ご迷惑をお掛けして本当に申し訳ありませんでした。
今後は、不良PGさんのおっしゃるとおり、なるべくソースを載せるようにしたいと思います。
皆様、本当にありがとうございました。
そして、今後ともよろしくお願い致します。