Verwalten des Dateisystems
Die Shell bietet eine Reihe von Möglichkeiten zum Verwalten von Dateisystemen. Die Shell bietet die Funktion SHFileOperation, die es einer Anwendung ermöglicht, Dateien programmgesteuert zu verschieben, zu kopieren, umzubenennen und zu löschen. Die Shell unterstützt auch einige zusätzliche Dateiverwaltungsfunktionen.
- HTML-Dokumente können mit verwandten Dateien wie Grafikdateien oder Stylesheets verbunden werden. Wenn das Dokument verschoben oder kopiert wird, werden auch die verbundenen Dateien automatisch verschoben oder kopiert.
- Für Systeme, die für mehr als einen Benutzer verfügbar sind, können Dateien auf Benutzerbasis verwaltet werden. Benutzer haben einfachen Zugriff auf ihre Datendateien, aber nicht auf Dateien, die anderen Benutzern gehören.
- Wenn Dokumentdateien hinzugefügt oder geändert werden, können sie der Liste der zuletzt verwendeten Dokumente der Shell hinzugefügt werden. Wenn der Benutzer im Startmenü auf den Befehl Dokumente klickt, wird eine Liste von Links zu den Dokumenten angezeigt.
In diesem Dokument wird erläutert, wie diese Dateiverwaltungstechnologien funktionieren. Anschließend wird beschrieben, wie Sie die Shell zum Verschieben, Kopieren, Umbenennen und Löschen von Dateien und zum Verwalten von Objekten im Papierkorb verwenden.
- Benutzerspezifische Dateiverwaltung
- Ordner "Eigene Dokumente" und "Eigene Bilder"
- Verbundene Dateien
- Verschieben, Kopieren, Umbenennen und Löschen von Dateien
- Einfaches Beispiel für die Verwaltung von Dateien mit SHFileOperation
- Hinzufügen von Dateien zur Liste der zuletzt verwendeten Dokumente der Shell
Mit der Windows 2000-Shell können Dateien einem bestimmten Benutzer zugeordnet werden, sodass die Dateien für andere Benutzer ausgeblendet bleiben. Im Hinblick auf das Dateisystem werden die Dateien unter dem Profilordner des Benutzers gespeichert, in der Regel C:\Dokumente und Einstellungen\Benutzername\ auf Windows 2000-Systemen. Dieses Feature ermöglicht es vielen Personen, denselben Computer zu verwenden, während die Privatsphäre ihrer Dateien von anderen Benutzern gewahrt bleibt. Verschiedene Benutzer können unterschiedliche Programme zur Verfügung haben. Außerdem bietet es Administratoren und Anwendungen eine einfache Möglichkeit, z. B. Initialisierungsdateien (.ini) oder Verknüpfungsdateien (LNK) zu speichern. Anwendungen können somit einen anderen Zustand für jeden Benutzer beibehalten und diesen zustand bei Bedarf problemlos wiederherstellen. Es gibt auch einen Profilordner zum Speichern von Informationen, die allen Benutzern gemeinsam sind.
Da es unbequem ist, zu bestimmen, welcher Benutzer angemeldet ist und wo sich seine Dateien befinden, sind die Standardordner pro Benutzer spezielle Ordner, die durch eine CSIDL identifiziert werden. Für instance wird die CSIDL für den Ordner "Programme pro Benutzer" CSIDL_PROGRAMS. Wenn Ihre Anwendung SHGetFolderLocation oder SHGetFolderPath mit einer der PRO-Benutzer-CSIDLs aufruft, gibt die Funktion den Zeiger auf eine Elementbezeichnerliste (Item Identifier List, PIDL) oder den Pfad zurück, der für den aktuell angemeldeten Benutzer geeignet ist. Wenn Ihre Anwendung den Pfad oder die PIDL des Profilordners abrufen muss, wird dessen CSIDL CSIDL_PROFILE.
Eines der Standardsymbole auf dem Desktop ist Meine Dokumente. Wenn Sie diesen Ordner öffnen, enthält er die Dokumentdateien des aktuellen Benutzers. Die Desktop-instance von "Eigene Dokumente" ist ein virtueller Ordner – ein Alias für den Speicherort des Dateisystems, der zum physischen Speichern der Dokumente des Benutzers verwendet wird – sich direkt unterhalb des Desktops in der Namespacehierarchie befindet.
Der Zweck der Ordner "Eigene Dokumente" und "Meine Bilder" besteht darin, Benutzern einen einfachen und sicheren Zugriff auf ihre Dokument- und Bilddateien auf einem System zu bieten, das möglicherweise mehrere Benutzer hat. Jedem Benutzer werden separate Dateisystemordner für seine Dateien zugewiesen. Beispielsweise ist der Speicherort des Ordners "Dokumente" eines Benutzers im Dateisystem in der Regel etwa C:\Dokumente und Einstellungen\Benutzername\Meine Dokumente. Benutzer müssen nichts über den physischen Speicherort ihrer Dateisystemordner wissen. Sie greifen einfach über das Symbol "Meine Dokumente" auf ihre Dateien zu.
Hinweis
Eigene Dokumente ermöglichen es einem Benutzer, auf seine eigenen Dateien zuzugreifen, aber nicht auf die eines anderen Benutzers. Wenn mehrere Personen denselben Computer verwenden, kann ein Administrator Benutzer aus dem Teil des Dateisystems sperren, in dem die eigentlichen Dateien gespeichert sind. Benutzer können also über den Ordner Eigene Dokumente an ihren eigenen Dokumenten arbeiten, aber nicht an Dokumenten, die anderen Benutzern gehören.
In der Regel muss eine Anwendung nicht wissen, welcher Benutzer angemeldet ist oder wo sich im Dateisystem der Ordner "Eigene Dokumente" befindet. Stattdessen kann Ihre Anwendung die PIDL des Desktopsymbols "Meine Dokumente" abrufen, indem sie die IShellFolder::P arseDisplayName-Methode des Desktops aufruft. Der Zum Identifizieren des Ordners "Eigene Dokumente" verwendete Analysename ist kein Dateipfad, sondern ::{450d8fba-ad25-11d0-98a8-0800361b1103}. Der in Klammern gesetzte Ausdruck ist die Textform der GUID "Meine Dokumente". Um beispielsweise die PIDL von "Meine Dokumente" abzurufen, sollte Ihre Anwendung diesen Aufruf von IShellFolder::P arseDisplayName verwenden.
hr = psfDeskTop->ParseDisplayName(NULL,
NULL,
L"::{450d8fba-ad25-11d0-98a8-0800361b1103}",
&chEaten,
&pidlDocFiles,
NULL);
Sobald Ihre Anwendung über die PIDL "Eigene Dokumente" verfügt, kann sie den Ordner genauso behandeln wie ein normaler Dateisystemordner. Dabei werden Elemente aufgelistet, analysiert, gebunden und alle anderen gültigen Ordnervorgänge ausgeführt. Die Shell ordnet Änderungen in "Eigene Dokumente" oder ihren Unterordnern automatisch den entsprechenden Dateisystemordnern zu.
Wenn Ihre Anwendung Zugriff auf den eigentlichen Dateisystemordner benötigt, der die Dokumente des aktuellen Benutzers enthält, übergeben Sie CSIDL_PERSONAL an SHGetFolderLocation. Die Funktion gibt die PIDL des Dateisystemordners zurück, der im Ordner "Eigene Dokumente" des aktuellen Benutzers angezeigt wird.
HTML-Dokumente enthalten häufig eine Reihe von zugehörigen Grafikdateien, eine Stylesheetdatei, mehrere Microsoft JScript-Dateien (kompatibel mit ECMA 262-Sprachspezifikation) usw. Wenn Sie das primäre HTML-Dokument verschieben oder kopieren, möchten Sie in der Regel auch die zugehörigen Dateien verschieben oder kopieren, um fehlerhafte Links zu vermeiden. Leider gab es bisher keine einfache Möglichkeit, zu bestimmen, welche Dateien mit einem bestimmten HTML-Dokument zusammenhängen, außer durch die Analyse ihrer Inhalte. Um dieses Problem zu beheben, bietet Windows 2000 eine einfache Möglichkeit, ein primäres HTML-Dokument mit seiner Gruppe zugeordneter Dateien zu verbinden . Wenn die Dateiverbindung aktiviert ist, werden beim Verschieben oder Kopieren des Dokuments alle verbundenen Dateien verwendet.
Um eine Gruppe verbundener Dateien zu erstellen, muss das primäre Dokument über eine .htm- oder .html Dateinamenerweiterung verfügen. Erstellen Sie einen Unterordner des übergeordneten Ordners des primären Dokuments. Der Name des Unterordners muss der Name des primären Dokuments sein, abzüglich der .htm- oder .html-Erweiterung, gefolgt von einer der unten aufgeführten Erweiterungen. Die am häufigsten verwendeten Erweiterungen sind ".files" oder "_files". Wenn das primäre Dokument instance MyDoc.htm heißt, wird der Unterordner mit dem Namen "MyDoc_files" als Container für die verbundenen Dateien des Dokuments definiert. Wenn das primäre Dokument verschoben oder kopiert wird, werden der Unterordner und die zugehörigen Dateien ebenfalls verschoben oder kopiert.
Für einige Sprachen ist es möglich, eine lokalisierte Entsprechung von "_files" zu verwenden, um einen Unterordner für verbundene Dateien zu erstellen. In der folgenden Tabelle sind die gültigen Zeichenfolgen aufgeführt, die an einen Dokumentnamen angefügt werden können, um einen Unterordner für verbundene Dateien zu erstellen. Beachten Sie, dass einige dieser Zeichenfolgen "-" als erstes Zeichen anstelle von "_" oder "." aufweisen.
"_archivos"
"_arquivos"
"_bestanden"
"_bylos"
"-Dateien"
"_datoteke"
"_dosyalar"
"_elemei"
"_failid"
"_fails"
"_fajlovi"
"_ficheiros"
"_fichiers"
"-filer"
".files"
"_files"
"_file"
"_fitxers"
"_fitxategiak"
"_pliki"
"_soubory"
"_tiedostot"
Hinweis
Dieses Feature berücksichtigt die Groß-/Kleinschreibung der Erweiterung. Für instance wird für das oben angegebene Beispiel kein Unterordner mit dem Namen "MyDoc_Files" mit MyDoc.htm verbunden.
Ob die Dateiverbindung aktiviert oder deaktiviert ist, wird durch den REG_DWORD Wert NoFileFolderConnection des folgenden Registrierungsschlüssels gesteuert.
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Explorer
Dieser Wert ist normalerweise nicht definiert, und die Dateiverbindung ist aktiviert. Bei Bedarf können Sie die Dateiverbindung deaktivieren, indem Sie diesen Wert zum Schlüssel hinzufügen und auf 1 festlegen. Um die Dateiverbindung wieder zu aktivieren, legen Sie NoFileFolderConnection auf Null fest.
Hinweis
Die Dateiverbindung sollte normalerweise aktiviert sein, da andere Anwendungen möglicherweise davon abhängen. Deaktivieren Sie die Dateiverbindung nur, wenn dies unbedingt erforderlich ist.
Der Namespace ist nicht statisch, und Anwendungen müssen das Dateisystem in der Regel verwalten, indem sie einen der folgenden Vorgänge ausführen.
- Kopieren eines Objekts in einen anderen Ordner.
- Verschieben eines Objekts in einen anderen Ordner.
- Löschen eines Objekts.
- Umbenennen eines Objekts.
Diese Vorgänge werden alle mit SHFileOperation ausgeführt. Diese Funktion übernimmt eine oder mehrere Quelldateien und erzeugt entsprechende Zieldateien. Im Fall des Löschvorgangs versucht das System, die gelöschten Dateien in den Papierkorb zu legen.
Es ist auch möglich, Dateien mithilfe der Drag-and-Drop-Funktion zu verschieben.
Um die Funktion zu verwenden, müssen Sie die Member einer SHFILEOPSTRUCT-Struktur ausfüllen und an SHFileOperation übergeben. Die Schlüsselmitglieder der Struktur sind pFrom und pTo.
Das pFrom-Element ist eine doppelte NULL-Zeichenfolge, die mindestens einen Quelldateinamen enthält. Diese Namen können entweder vollqualifizierte Pfade oder DOS-Standardplatzhalter wie *.*sein. Obwohl dieser Member als null-beendete Zeichenfolge deklariert wird, wird es als Puffer verwendet, um mehrere Dateinamen zu speichern. Jeder Dateiname muss durch das übliche einzelne NULL-Zeichen beendet werden. Ein zusätzliches NULL-Zeichen muss an das Ende des endgültigen Namens angefügt werden, um das Ende von pFrom anzugeben.
Das pTo-Element ist eine doppelte NULL-Zeichenfolge, ähnlich wie pFrom. Das pTo-Element enthält die Namen eines oder mehrerer vollqualifizierter Zielnamen. Sie werden in pTo genauso verpackt wie für pFrom. Wenn pTo mehrere Namen enthält, müssen Sie auch das FOF_MULTIDESTFILES-Flag im fFlags-Element festlegen. Die Verwendung von pTo hängt von der hier beschriebenen Operation ab.
- Wenn bei Kopier- und Verschiebungsvorgängen alle Dateien in ein einzelnes Verzeichnis verschoben werden, enthält pTo den vollqualifizierten Verzeichnisnamen. Wenn die Dateien an unterschiedliche Ziele gelangen, kann pTo auch ein vollqualifiziertes Verzeichnis oder einen Dateinamen für jede Quelldatei enthalten. Wenn kein Verzeichnis vorhanden ist, wird es vom System erstellt.
- Für Umbenennungsvorgänge enthält pTo einen vollqualifizierten Pfad für jede Quelldatei in pFrom.
- Für Löschvorgänge wird pTo nicht verwendet.
Benachrichtigen Sie die Shell über die Änderung, nachdem Sie SHFileOperation zum Verschieben, Kopieren, Umbenennen oder Löschen von Dateien verwendet haben, oder nachdem Sie eine andere Aktion ausgeführt haben, die sich auf den Namespace auswirkt. Zu den Aktionen, die von einer Benachrichtigung begleitet werden sollten, gehören folgendes:
- Hinzufügen oder Löschen von Dateien oder Ordnern.
- Verschieben, Kopieren oder Umbenennen von Dateien oder Ordnern.
- Ändern einer Dateizuordnung.
- Ändern von Dateiattributen
- Hinzufügen oder Entfernen von Laufwerken oder Speichermedien.
- Erstellen oder Deaktivieren eines freigegebenen Ordners.
- Ändern der Systemimageliste.
Eine Anwendung benachrichtigt die Shell, indem SIE SHChangeNotify mit den Details der Änderungen aufruft. Die Shell kann dann ihr Image des Namespace aktualisieren, um den neuen Zustand genau widerzuspiegeln.
Die folgende Beispielkonsolenanwendung veranschaulicht die Verwendung von SHFileOperation zum Kopieren von Dateien aus einem Verzeichnis in ein anderes. Die Quell- und Zielverzeichnisse C:\My_Docs und C:\My_Docs2 sind der Einfachheit halber hartcodiert.
#include <shlobj.h>
#include <shlwapi.h>
#include <strsafe.h>
int main(void)
{
IShellFolder *psfDeskTop = NULL;
IShellFolder *psfDocFiles = NULL;
LPITEMIDLIST pidlDocFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IEnumIDList *ppenum = NULL;
SHFILEOPSTRUCT sfo;
STRRET strDispName;
TCHAR szParseName[MAX_PATH];
TCHAR szSourceFiles[256];
int i;
int iBufPos = 0;
ULONG chEaten;
ULONG celtFetched;
size_t ParseNameSize = 0;
HRESULT hr;
szSourceFiles[0] = '\0';
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->ParseDisplayName(NULL, NULL, L"c:\\My_Docs",
&chEaten, &pidlDocFiles, NULL);
hr = psfDeskTop->BindToObject(pidlDocFiles, NULL, IID_IShellFolder,
(LPVOID *) &psfDocFiles);
hr = psfDeskTop->Release();
hr = psfDocFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
&ppenum);
while( (hr = ppenum->Next(1,&pidlItems, &celtFetched)) == S_OK
&& (celtFetched) == 1)
{
psfDocFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING,
&strDispName);
StrRetToBuf(&strDispName, pidlItems, szParseName, MAX_PATH);
hr = StringCchLength(szParseName, MAX_PATH, &ParseNameSize);
if (SUCCEEDED(hr))
{
for(i=0; i<=ParseNameSize; i++)
{
szSourceFiles[iBufPos++] = szParseName[i];
}
CoTaskMemFree(pidlItems);
}
}
ppenum->Release();
szSourceFiles[iBufPos] = '\0';
sfo.hwnd = NULL;
sfo.wFunc = FO_COPY;
sfo.pFrom = szSourceFiles;
sfo.pTo = "c:\\My_Docs2\0";
sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
hr = SHFileOperation(&sfo);
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH, (LPCVOID) "c:\\My_Docs2", 0);
CoTaskMemFree(pidlDocFiles);
psfDocFiles->Release();
return 0;
}
Die Anwendung ruft zuerst einen Zeiger auf die IShellFolder-Schnittstelle des Desktops ab. Anschließend wird die PIDL des Quellverzeichnisses abgerufen, indem der vollqualifizierte Pfad an IShellFolder::P arseDisplayName übergeben wird. Beachten Sie, dass IShellFolder::P arseDisplayName erfordert, dass der Pfad des Verzeichnisses eine Unicode-Zeichenfolge sein muss. Die Anwendung bindet dann an das Quellverzeichnis und verwendet ihre IShellFolder-Schnittstelle , um die IEnumIDList-Schnittstelle eines Enumeratorobjekts abzurufen.
Da jede Datei im Quellverzeichnis aufgelistet ist, wird IShellFolder::GetDisplayNameOf verwendet, um ihren Namen abzurufen. Das SHGDN_FORPARSING-Flag ist festgelegt, wodurch IShellFolder::GetDisplayNameOf den vollqualifizierten Pfad der Datei zurückgibt. Die Dateipfade, einschließlich der beendenden NULL-Zeichen , werden in ein einzelnes Array verkettet, szSourceFiles. Ein zweites NULL-Zeichen wird an den endgültigen Pfad angefügt, um das Array ordnungsgemäß zu beenden.
Sobald die Enumeration abgeschlossen ist, weist die Anwendung einer SHFILEOPSTRUCT-Struktur Werte zu. Beachten Sie, dass das Array, das pTo zum Angeben des Ziels zugewiesen ist, auch durch einen doppelten NULL-Wert beendet werden muss. In diesem Fall wird es einfach in die Zeichenfolge eingeschlossen, die pTo zugewiesen ist. Da es sich um eine Konsolenanwendung handelt, werden die flags FOF_SILENT, FOF_NOCONFIRMATION und FOF_NOCONFIRMMKDIR festgelegt, um alle angezeigten Dialogfelder zu unterdrücken. Nachdem SHFileOperation zurückgegeben wurde, wird SHChangeNotify aufgerufen, um die Shell über die Änderung zu benachrichtigen. Anschließend führt die Anwendung die übliche Bereinigung durch und gibt zurück.
Die Shell verwaltet eine Liste der zuletzt hinzugefügten oder geänderten Dokumente für jeden Benutzer. Der Benutzer kann eine Liste von Links zu diesen Dateien anzeigen, indem er im Startmenü auf Dokumente klickt. Wie bei "Eigene Dokumente" verfügt jeder Benutzer über ein Dateisystemverzeichnis, in dem die eigentlichen Links gespeichert werden. Um die PIDL des aktuellen Benutzers zuletzt abzurufen, kann Ihre Anwendung SHGetFolderLocation mit CSIDL_RECENT aufrufen oder SHGetFolderPath aufrufen, um den Pfad abzurufen.
Ihre Anwendung kann den Inhalt des Ordners Zuletzt verwendet mit den zuvor in diesem Dokument erläuterten Techniken auflisten. Eine Anwendung sollte den Inhalt des Ordners jedoch nicht so ändern, als wäre er ein normaler Dateisystemordner. In diesem Fall wird die Liste der zuletzt verwendeten Dokumente der Shell nicht ordnungsgemäß aktualisiert, und die Änderungen werden nicht im Startmenü angezeigt. Stattdessen kann Ihre Anwendung SHAddToRecentDocs aufrufen, um dem Ordner Zuletzt verwendet einen Dokumentlink hinzuzufügen. Die Shell fügt einen Link zum entsprechenden Dateisystemordner hinzu, aktualisiert die Liste der zuletzt verwendeten Dokumente und das Startmenü. Sie können diese Funktion auch verwenden, um den Ordner zu löschen.