Abrufen und Ändern von Dateiattributen
Eine Anwendung kann die Dateiattribute mithilfe der Funktion GetFileAttributes oder GetFileAttributesEx abrufen. Die Funktionen CreateFile und SetFileAttributes können viele der Attribute festlegen. Anwendungen können jedoch nicht alle Attribute festlegen.
Im Codebeispiel in diesem Thema wird die CopyFile-Funktion verwendet, um alle Textdateien (.txt) im aktuellen Verzeichnis in ein neues Verzeichnis mit schreibgeschützten Dateien zu kopieren. Dateien im neuen Verzeichnis werden bei Bedarf in schreibgeschützte Dateien geändert.
Die Anwendung erstellt das als Parameter angegebene Verzeichnis mithilfe der CreateDirectory-Funktion . Das Verzeichnis darf noch nicht vorhanden sein.
Die Anwendung durchsucht das aktuelle Verzeichnis nach allen Textdateien mithilfe der Funktionen FindFirstFile und FindNextFile . Jede Textdatei wird in das Verzeichnis \TextRO kopiert. Nachdem eine Datei kopiert wurde, bestimmt die GetFileAttributes-Funktion , ob eine Datei schreibgeschützter Ist. Wenn die Datei nicht schreibschützt ist, ändert die Anwendung die Verzeichnisse in \TextRO und konvertiert die kopierte Datei mithilfe der SetFileAttributes-Funktion in schreibgeschützte Dateien.
Nachdem alle Textdateien im aktuellen Verzeichnis kopiert wurden, schließt die Anwendung das Suchhandle mithilfe der FindClose-Funktion .
#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);
}
Zugehörige Themen