CopyFileのアクセス権

[戻る]
まる 2002/05/17(金) 17:34:09
いつもお世話になっております。
まると申します。
WinMe、VC++6.0、SDKで開発してます。

今回はCopyFileについて質問させていただきます。
CDドライブ(Dドライブ)からEXEを走らせて、
Dドライブ中のファイルをWindowsのSystemフォルダの下にコピーしたいのですが、
ファイルのパスは間違っていないのにCopyFileでエラーが発生してしまいます。
(CopyFile(orgFILE,destFile,FALSE)としています。)

CopyFile関数でSystemフォルダにコピーする時に、
コピー先のアクセス権などが必要なのでしょうか?
(ちなみに、Win2000では問題なく動作します)

なにか情報をお持ちでしたらお教え願います。
以上、よろしくお願い致します。

sugar 2002/05/17(金) 17:56:38
アクセス権という観点は否定できませんが、
まずは発生しているエラーの種類を特定しましょう。
CopyFile()が失敗したとき、GetLastError()で調べられるのですから。

まる 2002/05/17(金) 18:16:42
>Sugarさん
今回もお返事いただきありがとうございます。
そして、エラーの種類を書き忘れておりました。
すみません。

改めて、エラーの種類ですが、「アクセスが拒否されました」というエラーです。
なので、アクセス権が関係あるのかも?と思った次第です。
よろしくお願い致します。

sugar 2002/05/18(土) 00:34:07
次のパターンを試してみましょう。
・CDドライブから、特殊フォルダではない任意のフォルダへのファイルコピー
・特殊フォルダではない任意のフォルダからSystemフォルダへのファイルコピー
・CDドライブから、Systemフォルダへのファイルコピー
 (ただし、ファイルの指定は変数ではなくリテラル指定)

それとも、コピー先に読取専用の同名ファイルがあったりします?

WinMeを使用ですか...
私はあまり関わった経験がないですが、95系列のWindowsOSですよね、
NT張りのアクセス権限なんてありましたっけ??>どなたか識者の方

YuO [E-Mail] 2002/05/18(土) 01:29:44
Win MEはFATだから基本的にアクセス権なんて概念ないと思うのですが……。

それはともかく,コピーをコマンドラインからおこなったらどうなります?
単純にファイルが開かれていたりして読み書きできないのでは?

不良PG [E-Mail] 2002/05/18(土) 03:14:40
推測ですが・・・

ひょっとして使用中のDLLを上書きコピーしようとしていませんか・・


コードを示したほうが明確な回答が得られると思いますが・・

まる 2002/05/20(月) 15:10:29
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を実行すると成功するという点です。
更にこのバグを追いかけてみます。

皆様、お返事いただき本当にありがとうございました。
心当たりや、もしかしたら?ということがありましたら、
またご教授いただけると嬉しいです。

dairygoods 2002/05/20(月) 15:31:24
> GetCurrentDirectory(MAX_PATH,SetupDir);

GetCurrentDirectoryに限らず、ディレクトリを得るAPIは、
ドライブ直下では、"C:\" のように末尾に'\'が付き、
それ以外では、"C:\Windows\system" のように末尾に'\'が付きません。

> lstrcat(SetupDir,TEXT("\\test.dll");

よって、このように単純な文字列連結を行ってはいけません。

まる 2002/05/20(月) 16:04:11
[[解決]]
>dairygoodsさん
GetCurrentDirectory関数で、末尾に”¥”が付くかどうか知りませんでした。
おっしゃる通りに考えると、きっとその判断の所為でコピー元ディレクトリに
アクセスできない可能性があります。
アクセス拒否のエラーメッセージを見てCopyFile関数で失敗したので、
ついコピーに失敗しているものだと思っていました。
その判断を追加して試してみたいと思います。

関数の使い方の間違いだったとしたら、本当に申し訳ありませんでした。
実際に上記のコーディングでダメだったら、また改めて質問させていただきます。
皆様ご迷惑をお掛けして本当に申し訳ありませんでした。
今後は、不良PGさんのおっしゃるとおり、なるべくソースを載せるようにしたいと思います。

皆様、本当にありがとうございました。
そして、今後ともよろしくお願い致します。

古いスレッドには追加発言できません。