【问题标题】:Can't close OPENFILENAME无法关闭 OPENFILENAME
【发布时间】:2018-06-18 09:00:36
【问题描述】:

我使用 OPENFILENAME 和函数 GetOpenFileName() 通过 windows 文件浏览器获取文件位置。

问题是当我想删除所选文件夹时(当程序运行并且我需要这样做时)窗口显示错误:“操作无法完成,因为文件夹或其中的文件在另一个程序”

我知道为什么会这样,但我不知道如何在运行时关闭此文件

谢谢,提前。

编辑:

//Opening Save file
    TCHAR *filter = _T("Story File(*.Strory*)\0*.Story*\0");
    HWND owner = NULL;

    OPENFILENAME ofn;
    TCHAR fileName[MAX_PATH] = _T("");
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = owner;
    ofn.lpstrFilter = filter;
    ofn.lpstrFile = fileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = _T("");

    if (GetOpenFileName(&ofn))
    {

    }

此代码是我创建和使用 OPENFILENAME 变量的地方,GetOpenFileName() 将自动将所选文件锁定为“在程序中打开”,并防止在程序运行期间对文件夹进行任何修改(如删除或重命名)。但我想禁用此属性。

【问题讨论】:

  • 您能否分享更多关于您正在尝试做的事情以及您遇到问题的代码 sn-p 的详细信息?
  • 如果你想要@Matt,我已经进行了编辑
  • "...GetOpenFileName() 将自动将所选文件锁定为“在程序中打开”...":不,它看不到 MS 示例代码: msdn.microsoft.com/en-us/library/windows/desktop/…GetOpenFileName 返回打开文件时,您必须调用CreateFile
  • 如果您不使用OFN_NOCHANGEDIR 标记GetOpenFileName 打开文件夹的句柄,您可以在其中选择文件。正是这个文件夹句柄(当前目录)阻止删除
  • @RichardCritten:之前已经测试过了,它没有改变任何东西(我在你回答后第二次测试它,它也没有解决我的问题)。

标签: c++ file winapi getopenfilename


【解决方案1】:

其他一些应用程序拥有您要删除的文件夹的打开句柄。如果有任何其他客户端处理存储在文件夹中的数据,Windows 将无法删除该文件夹。 要解决这个问题,您可以尝试:

  • 检查是否有任何打开的资源管理器窗口显示您要删除的文件夹/此文件夹中的任何包含文件
  • 检查是否有任何命令提示符已打开,并且它们的当前目录是否设置为您要删除的文件夹
  • 检查您的应用程序(或任何其他应用程序)是否正在使用此文件夹中的任何数据(例如打开此文件夹中的文本文件的记事本)

【讨论】:

  • 此文件夹上没有其他应用程序或任何打开的东西,我只能在程序运行期间无法删除该文件夹。当我关闭它(我的程序)时,我可以从我的程序中删除它。
  • 您自己的应用程序是否为该文件夹打开了任何文件描述符?
【解决方案2】:

如果您在OPENFILENAME 中不使用OFN_NOCHANGEDIR 标志,则GetOpenFileName 目录的打开句柄,您可以在其中选择文件并将其设置为当前目录。正是这个文件夹句柄防止删除它。您可以使用OFN_NOCHANGEDIR 标志或在删除文件夹之前将当前目录更改为另一个。对 windows 目录说 - 你不要删除它:

WCHAR path[MAX_PATH];
GetSystemWindowsDirectoryW(path, RTL_NUMBER_OF(path));
SetCurrentDirectoryW(path);

【讨论】:

  • 我找到了我的评论的解决方案:“@RbMm:谢谢它有效,但我还有另一个问题,我可以从浏览器中删除,但我不能用我的程序删除文件夹也许你知道为什么”,这部分是我的错误谢谢你的回答。
  • 救我一命,谢谢。
猜你喜欢
  • 2013-03-23
  • 2022-06-17
  • 1970-01-01
  • 2016-09-20
  • 2010-11-08
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多