CopyFileのアクセス権 – プログラミング – Home

通知
すべてクリア

[解決済] CopyFileのアクセス権


まる
 まる
(@まる)
ゲスト
結合: 23年前
投稿: 45
Topic starter  

いつもお世話になっております。
まると申します。
WinMe、VC++6.0、SDKで開発してます。

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

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

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


引用未解決
トピックタグ
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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


返信引用
まる
 まる
(@まる)
ゲスト
結合: 23年前
投稿: 45
Topic starter  

>Sugarさん
今回もお返事いただきありがとうございます。
そして、エラーの種類を書き忘れておりました。
すみません。

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


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

Win MEはFATだから基本的にアクセス権なんて概念ないと思うのですが……。

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 80
 

推測ですが・・・

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

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


返信引用
まる
 まる
(@まる)
ゲスト
結合: 23年前
投稿: 45
Topic starter  

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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> GetCurrentDirectory(MAX_PATH,SetupDir);

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

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

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


返信引用
まる
 まる
(@まる)
ゲスト
結合: 23年前
投稿: 45
Topic starter  

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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