【问题标题】:Can I CopyFile after LockFileEx it?我可以在 LockFileEx 之后 CopyFile 吗?
【发布时间】:2018-03-28 03:12:13
【问题描述】:

所以,我正在尝试在锁定文件后复制文件!但是我得到了 GetLastError() = 32 - “该进程无法访问该文件,因为它正在被另一个进程使用。”

按顺序,是同一进程使用该文件,因为它首先被锁定。我正在使用多进程应用程序并使用 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。

【问题讨论】:

  • 引用:“如果锁定进程第二次打开文件,它不能通过第二个句柄访问指定区域,直到它解锁该区域。”是的,这就是 CopyFile 的作用。
  • 好的,谢谢。在所有指令之后,我只解决了 CopyFile 的问题,但我的逻辑问题继续存在。实际上,我需要类似于文件“重命名”的东西,如果我只使用一个函数重命名多个进程可以做到这一点。

标签: c++ file winapi multiprocessing


【解决方案1】:

您调用CreateFile 将0 作为dwShareMode 标志传递,因此会阻止对它的所有读写访问,直到此文件句柄关闭。而LockFileEx 也不是必须的。

PS cfile 未初始化,您的意思是 cfile = CreateFile(... 吗?此外,GetLastError 必须在调用失败后立即调用,否则返回的值可能会被更改。而且你根本不检查LockFileEx和其他方法的结果。

【讨论】:

  • 意识到有两个进程同时访问文件内容后,我才放了LockFileEx。但是,我会再次检查。关于PS,你是对的,对不起,我忘记了,但刚刚更正了。在我的原始代码中,我关心调用标志 LockFileEx。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2021-01-02
  • 2011-12-15
  • 2012-06-12
  • 2019-02-11
  • 2011-05-14
相关资源
最近更新 更多