Recupero e modifica degli attributi di file
Un'applicazione può recuperare gli attributi del file usando la funzione GetFileAttributes o GetFileAttributesEx. Le funzioni CreateFile e SetFileAttributes possono impostare molti attributi. Tuttavia, le applicazioni non possono impostare tutti gli attributi.
Nell'esempio di codice di questo argomento viene utilizzata la funzioneCopyFileper copiare tutti i file di testo (.txt) nella directory corrente in una nuova directory di file di sola lettura. I file nella nuova directory vengono impostati su sola lettura, se necessario.
L'applicazione crea la directory specificata come parametro usando la funzione CreateDirectory. La directory non deve esistere già.
L'applicazione cerca nella directory corrente tutti i file di testo usando le funzioni FindFirstFile e FindNextFile. Ogni file di testo viene copiato nella directory \TextRO. Dopo la copia di un file, la funzioneGetFileAttributesdetermina se un file è di sola lettura. Se il file non è di sola lettura, l'applicazione cambia directory in \TextRO e converte il file copiato in sola lettura usando la funzione SetFileAttributes.
Dopo aver copiato tutti i file di testo nella directory corrente, l'applicazione chiude l'handle di ricerca usando la funzioneFindClose.
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>
void _tmain(int argc, TCHAR* argv[])
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
DWORD dwAttrs;
TCHAR szNewPath[MAX_PATH];
BOOL fFinished = FALSE;
if(argc != 2)
{
_tprintf(TEXT("Usage: %s <dir>\n"), argv[0]);
return;
}
// Create a new directory.
if (!CreateDirectory(argv[1], NULL))
{
printf("CreateDirectory failed (%d)\n", GetLastError());
return;
}
// Start searching for text files in the current directory.
hSearch = FindFirstFile(TEXT("*.txt"), &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
printf("No text files found.\n");
return;
}
// Copy each .TXT file to the new directory
// and change it to read only, if not already.
while (!fFinished)
{
StringCchPrintf(szNewPath, sizeof(szNewPath)/sizeof(szNewPath[0]), TEXT("%s\\%s"), argv[1], FileData.cFileName);
if (CopyFile(FileData.cFileName, szNewPath, FALSE))
{
dwAttrs = GetFileAttributes(FileData.cFileName);
if (dwAttrs==INVALID_FILE_ATTRIBUTES) return;
if (!(dwAttrs & FILE_ATTRIBUTE_READONLY))
{
SetFileAttributes(szNewPath,
dwAttrs | FILE_ATTRIBUTE_READONLY);
}
}
else
{
printf("Could not copy file.\n");
return;
}
if (!FindNextFile(hSearch, &FileData))
{
if (GetLastError() == ERROR_NO_MORE_FILES)
{
_tprintf(TEXT("Copied *.txt to %s\n"), argv[1]);
fFinished = TRUE;
}
else
{
printf("Could not find next file.\n");
return;
}
}
}
// Close the search handle.
FindClose(hSearch);
}
Argomenti correlati