2017-10-16 57 views
0

所以,我試圖鎖定它後複製文件!但是我得到了GetLastError()= 32 - 「進程無法訪問該文件,因爲它正在被另一個進程使用。」可以在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); 

有人知道是否有可能做我正在嘗試的?我使用Windows和VS 2015

+1

Quote:「如果鎖定過程第二次打開文件,它不能通過此第二個句柄訪問指定區域,直到它解鎖區域。」是的,這就是CopyFile所做的。 –

+0

是的,謝謝。我解決了所有指令後CopyFile的問題,但我的邏輯問題依然存在。其實,我需要類似於文件「重命名」的東西,如果我只用一個函數重命名多個進程就可以做到這一點。 – GLMF

回答

1

你叫CreateFile傳遞0作爲dwShareMode標誌因此阻止所有讀取和寫入訪問到它,直到該文件句柄被關閉。而LockFileEx並不是真的有必要。

PS cfile未初始化,您的意思是cfile = CreateFile(...?調用失敗後必須立即調用GetLastError,否則返回的值可能會改變。而且你根本不檢查LockFileEx和其他方法的結果。

+0

我意識到有兩個進程同時訪問文件內容後,我剛推出LockFileEx。但是,我會再次檢查。關於PS,你是對的,對不起,我忘了,但只是糾正。在我最初的代碼中,我關心的是調用標誌LockFileEx。 – GLMF

相關問題