2017-10-16 27 views
0

私はファイルをロックした後にコピーしようとしています!しかし、私はGetLastError()= 32を取得しました。 "プロセスは別のプロセスで使用されているため、ファイルにアクセスできません。"LockFileExの後にファイルをコピーすることはできますか?

最初にロックされたため、ファイルを使用している同じプロセスですか?私はマルチプロセスアプリケーションで作業していて、LockFileExを使用して他のプロセスを除いて、等価ファイル情報を処理します。また、私はLockFileExのドキュメントを読んでいて、LockFileExをロックした後にCopyFileに不可能なことを見つけられませんでした。

HANDLE cfile; 
bool alreadyExistFile = FALSE; 
OVERLAPPED sOverlapped; 
sOverlapped.Offset = 1; 
sOverlapped.OffsetHigh = 0; 

cfile = CreateFile(TEXT("CounterSeedAssincrono.csv.csv"), 
     GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL); 

LockFileEx(cfile, LOCKFILE_EXCLUSIVE_LOCK | 
     LOCKFILE_FAIL_IMMEDIATELY, 0, 10000, 0, &sOverlapped); 

CopyFile(TEXT("CounterSeedAssincrono.csv"), 
    TEXT("CounterSeedAssincrono_A.csv"), alreadyExistFile); 

if (alreadyExistFile == FALSE) 
    cout << "CopyFile Failed -> " << GetLastError() << endl; 

UnlockFileEx(cfile, 0, 10000, 0, &sOverlapped); 

CloseHandle(cfile); 

私は何をしようとしているのですか?

+1

引用:「ロック処理がファイルをもう一度開くと、領域をロック解除するまで、この2番目のハンドルで指定された領域にアクセスできません。うん、それはCopyFileがすることだ。 –

+0

はい、ありがとうございます。私はすべての命令の後に問題を解決するだけでCopyFile、しかし私の論理問題は続く。実際には、名前を変更するファイルに似た何かが必​​要です。ただ一つの関数名を変更するだけで複数のプロセスがそれを行うことができます。 – GLMF

答えて

1

CreateFileを0にすると、dwShareModeフラグとなり、このファイルハンドルが閉じられるまで、すべての読み取りと書き込みのアクセスがブロックされます。 LockFileExは本当に必要ではありません。

PS cfileは未初期化のままですが、cfile = CreateFile(...を意味しましたか?また、GetLastErrorは、呼び出しが失敗した直後に呼び出す必要があります。そうでない場合は、返された値が変更される可能性があります。そして、あなたはLockFileExと他の方法の結果を全くチェックしません。

+0

ファイルコンテンツに同時にアクセスするプロセスが2つあることを知った後、私はLockFileExを出しました。しかし、私は再び確認します。 PSについて、あなたは正しいです、私は忘れて申し訳ありませんが、ただ修正しました。私の元のコードでは、呼び出しフラグLockFileExが気になります。 – GLMF

関連する問題