2014-02-08 1 views
2

Насколько я знаю, способ создания скрытой папки:Win - Можете ли вы создать скрытую папку за один шаг?

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

Выполнение этого приводит к тому, что каталог существует, на мгновение, как не скрытый. Другие программы, такие как облачное программное обеспечение и резервное копирование, могут ошибочно воспринимать его как не скрытое ... и что-то делать с ним.

Можно ли достичь одного и того же в одном вызове API? Один атомный шаг? Похоже, это должно быть возможно! ??

ответ

1

Для этого можно использовать CreateDirectoryEx.

Создает новый каталог с атрибутами указанного каталога шаблонов. Если базовая файловая система поддерживает безопасность файлов и каталогов, эта функция применяет указанный дескриптор безопасности к новому каталогу. В новом каталоге сохраняются другие атрибуты указанного каталога шаблонов.

Вам нужен каталог шаблонов, удобный с подходящими (то есть скрытыми) атрибутами.

+0

Тогда просто использовать CreateDirectoryEx для создания каталога шаблонов. Нет, подождите ... – manuell

+0

@manuell вам нужен только один шаблон dir –

+0

Я шутил. Я не смешной. – manuell

1

Может быть, эти шаги помогут вам:

  1. Создайте каталог вне зоны резервного копирования/облака,
  2. сделать его скрытым,
  3. затем переместить его в нужное место.
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 is zero), или
  • просто верните уникальное имя (uUnique is no п-ноль).

Затем создайте каталог этого имени в каталоге temp. Когда вы получите это условие, вы хотите его атрибуты WRT (скрытые и т. Д.), Затем переместите его в свое конечное местоположение с MoveFile() или MoveFileEx().

Конечно, может быть проще просто получить временный путь, как указано выше, и итеративно попытаться создать подкаталог, создавая уникальное имя temp с помощью GUID или текущей даты/времени и добавляя добавочный суффикс. Как только каталог будет создан, установите его атрибуты и действуйте как указано выше, чтобы переместить его в конечное местоположение.

+0

MoveFile/Ex() не может перемещать каталоги на томах, поэтому это будет работать, только если пункт назначения находится на том же диске, что и временная директория. –

+0

Идея «temp» может быть крутой с идеей «шаблона» от Дэвида Хеффернана. – manuell

+0

Это, по-моему, действительно хакки. Под капотом это можно сделать за один шаг. – Lompican

0

Использование CreateDirectoryTransacted() и SetFileAttributesTransacted() внутри одной транзакции, которая создается с CreateTransaction() и совершаемой CommitTransaction(), например:

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

Эти API устарели и будут удалены, как я помню. –

+0

Microsoft, однако, не имеет привычки удалять устаревшие API. –

+0

Это правда. И обычно я бы взял эту позицию. Но они кажутся более резкими в отношении транзакций, чем многие другие устаревшие API. –

 Смежные вопросы

  • Нет связанных вопросов^_^