赢 - 您可以一步创建隐藏文件夹吗?

时间:2014-02-08 00:24:54

标签: windows winapi visual-c++ ntfs

据我所知,创建隐藏文件夹的方法是:

CreateDirectory(folderName); SetFileAttributes(folderName,FILE_ATTRIBUTE_HIDDEN);

执行此操作会导致目录暂时存在,因为未隐藏。云软件和备份等其他程序可能会错误地将其视为非隐藏...并对其执行某些操作。

是否可以在单个API调用中实现相同的功能?一个原子步骤?好像应该是可能的! ??

4 个答案:

答案 0 :(得分:1)

也许这些步骤可以帮到你:

  1. 在备份/云区域外创建目录
  2. 隐藏,
  3. 然后将其移至所需位置。

答案 1 :(得分:1)

您可以使用CreateDirectoryEx

  

使用指定模板目录的属性创建新目录。如果基础文件系统支持文件和目录的安全性,则该函数将指定的安全描述符应用于新目录。新目录保留指定模板目录的其他属性。

您需要一个方便的模板目录和合适的(即隐藏的)属性。

答案 2 :(得分:1)

将目录创建为临时目录。 GetTempPath()将为您提供临时目录的路径:

DWORD WINAPI GetTempPath(
  _In_   DWORD nBufferLength,
  _Out_  LPTSTR lpBuffer
  ) ;

使用它来创建GetTempFileName()的唯一临时文件名:

UINT WINAPI GetTempFileName(
  _In_   LPCTSTR lpPathName,
  _In_   LPCTSTR lpPrefixString,
  _In_   UINT uUnique,
  _Out_  LPTSTR lpTempFileName
  ) ;

根据它的调用方式,这将是

  • 创建一个具有唯一名称的空文件(uUnique为零)或
  • 只返回唯一名称(uUnique非零)。

然后在temp目录中创建该名称的目录。如果你已经进入了你需要WRT属性(隐藏等)的状态,那么使用MoveFile()MoveFileEx()将其移动到最终位置。

当然,如上所述获取临时路径可能更容易,并且迭代尝试创建子目录,使用GUID或当前日期/时间生成唯一临时名称并附加递增后缀。创建目录后,设置其属性并按上述步骤将其移动到最终位置。

答案 3 :(得分:0)

在使用CreateDirectoryTransacted()创建并使用SetFileAttributesTransacted()提交的单个交易中使用CreateTransaction()CommitTransaction(),例如:

HANDLE hTrans = CreateTransaction(...);
CreateDirectoryTransacted(..., hTrans);
SetFileAttributesTransacted(..., hTrans);
CommitTransaction(hTrans);
CloseHandle(hTrans);