Verwalten des Dateisystems

Die Shell bietet eine Reihe von Möglichkeiten zum Verwalten von Dateisystemen. Die Shell bietet die Funktion SHFileOperation,mit der eine Anwendung Dateien programmgesteuert verschieben, kopieren, umbenennen und löschen kann. 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 die verbundenen Dateien automatisch verschoben oder kopiert.
  • Für Systeme, die für mehrere 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 Shellliste der zuletzt bearbeiteten Dokumente hinzugefügt werden. Wenn der Benutzer auf den Befehl Dokumente in der Startmenü, wird eine Liste mit Links zu den Dokumenten angezeigt.

In diesem Dokument wird erläutert, wie diese Dateiverwaltungstechnologien funktionieren. Anschließend wird beschrieben, wie Sie die Shell verwenden, um Dateien zu verschieben, zu kopieren, umzubenennen und zu löschen, und wie Sie Objekte in der Papierkorb.

Per-User Dateiverwaltung

Mit 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 im 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 und gleichzeitig den Datenschutz ihrer Dateien vor anderen Benutzern zu gewährleisten. Für verschiedene Benutzer können verschiedene Programme verfügbar sein. Außerdem bietet es Administratoren und Anwendungen eine einfache Möglichkeit, z. B. Initialisierungsdateien (.ini) oder Linkdateien (LNK) zu speichern. Anwendungen können daher einen anderen Zustand für jeden Benutzer beibehalten und diesen bestimmten Zustand bei Bedarf problemlos wiederherstellen. Es gibt auch einen Profilordner zum Speichern von Informationen, die allen Benutzern gemeinsam sind.

Da es unüblich ist, zu bestimmen, welcher Benutzer angemeldet ist und wo sich die Dateien befinden, sind die Standardordner pro Benutzer spezielle Ordner und werden durch eine CSIDL identifiziert. Die CSIDL für den Ordner Pro-Benutzer-Programmdateien ist z. B. CSIDL _ PROGRAMS. Wenn Ihre Anwendung SHGetFolderLocation oder SHGetFolderPath mit einer der benutzerspezifischen CSIDLs aufruft, gibt die Funktion den Zeiger auf eine Elementbezeichnerliste (PIDL) oder einen Pfad zurück, der für den aktuell angemeldeten Benutzer geeignet ist. Wenn Ihre Anwendung den Pfad oder die PIDL des Profilordners abrufen muss, ist die CSIDL CSIDL _ PROFILE.

Eigene Dokumente und Meine Bilderordner

Eines der Standardsymbole auf dem Desktop ist Eigene Dokumente. Wenn Sie diesen Ordner öffnen, enthält er die Dokumentdateien des aktuellen Benutzers. Die Desktopinstanz von Eigene Dokumente ist ein virtueller Ordner – ein Alias für den Dateisystemspeicherort, der zum physischen Speichern der Benutzerdokumente verwendet wird – direkt unter dem Desktop in der Namespacehierarchie.

Der Zweck der Ordner Eigene Dokumente und Meine Bilder besteht in einer einfachen und sicheren Möglichkeit für Benutzer, auf ihre Dokument- und Bilddateien auf einem System zu zugreifen, das möglicherweise mehrere Benutzer hat. Jedem Benutzer werden separate Dateisystemordner für seine Dateien zugewiesen. Der Speicherort des Ordners "Dokumente" eines Benutzers im Dateisystem ist in der Regel etwa C: Dokumente und Einstellungen \ \ Benutzername \ Eigene Dokumente. Benutzer müssen nichts über den physischen Speicherort ihrer Dateisystemordner wissen. Sie greifen einfach über das Symbol für die Eigene Dokumente auf ihre Dateien zu.

Hinweis

Eigene Dokumente kann ein Benutzer auf seine eigenen Dateien zugreifen, aber nicht auf die dateien 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 daher über den Ordner "Eigene Dokumente" an ihren eigenen Dokumenten arbeiten, jedoch nicht an Dokumenten, die anderen Benutzern gehören.

In der Regel ist es nicht notwendig, dass eine Anwendung weiß, welcher Benutzer angemeldet ist oder wo sich im Dateisystem der Eigene Dokumente befindet. Stattdessen kann Ihre Anwendung die PIDL des Eigene Dokumente-Desktopsymbols abrufen, indem sie die IShellFolder::P arseDisplayName-Methode des Desktops aufruft. Der Analysename, der zum Identifizieren des Eigene Dokumente-Ordners verwendet wird, ist kein Dateipfad, sondern ::{450d8fba-ad25-11d0-98a8-0800361b1103}. Der Ausdruck in Klammern ist die Textform der Eigene Dokumente GUID. Um beispielsweise die PIDL von Eigene 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 Eigene Dokumente PIDL verfügt, kann sie den Ordner genauso verarbeiten wie ein normaler Dateisystemordner– aufzählen von Elementen, Analyse, Bindung und Ausführen anderer gültiger Ordnervorgänge. Die Shell ordnet Änderungen in Eigene Dokumente oder deren Unterordner den entsprechenden Dateisystemordnern automatisch zu.

Wenn Ihre Anwendung Zugriff auf den tatsächlichen 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 angezeigt wird.

Verbundene Dateien

HTML-Dokumente verfügen häufig über eine Reihe von zugeordneten Grafikdateien, eine Stylesheetdatei, mehrere Microsoft JScript -Dateien (kompatibel mit ECMA 262-Sprachspezifikation) und so weiter. Wenn Sie das primäre HTML-Dokument verschieben oder kopieren, sollten Sie in der Regel auch die zugehörigen Dateien verschieben oder kopieren, um Breaking Links zu vermeiden. Leider gab es bis jetzt keine einfache Möglichkeit, zu bestimmen, welche Dateien mit einem bestimmten HTML-Dokument verknüpft sind, mit der 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 Entfernen 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 ohne die erweiterung .htm oder .html sein, gefolgt von einer der unten aufgeführten Erweiterungen. Die am häufigsten verwendeten Erweiterungen sind ".files" oder _ "files". Wenn das primäre Dokument z. B. MyDoc.htm heißt, definiert die Benennung des Unterordners "MyDoc files" den Unterordner als Container für die verbundenen _ Dateien des Dokuments. Wenn das primäre Dokument verschoben oder kopiert wird, werden auch der Unterordner und seine Dateien 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 "." haben.

" _ archivos"

" _ arquivos"

" _ bestanden"

" _ bylos"

"-Dateien"

" _ datoteke"

" _ dosyalar"

" _ elemei"

" _ failid"

" _ fails"

" _ fajlovi"

" _ fich wies"

" _ fichiers"

"-filer"

".files"

" _ Files"

" _ file"

" _ fitxers"

" _ fitxatekatkatk"

" _ pliki"

" _ soubory"

" _ tiedostot"

Hinweis

Dieses Feature ist für den Fall der Erweiterung vertraulich. Für das oben genannte Beispiel wird beispielsweise kein Unterordner mit dem Namen "MyDoc Files" mit dem _ MyDoc.htm.

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 erneut zu aktivieren, legen Sie NoFileFolderConnection auf 0 (null) fest.

Hinweis

Die Dateiverbindung sollte normalerweise aktiviert werden, da andere Anwendungen davon abhängig sein können. Deaktivieren Sie die Dateiverbindung nur, wenn dies unbedingt erforderlich ist.

Verschieben, Kopieren, Umbenennen und Löschen von Dateien

Der Namespace ist nicht statisch, und Anwendungen müssen das Dateisystem häufig 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 SHFileOperationausgeführt. Diese Funktion verwendet eine oder mehrere Quelldateien und erzeugt entsprechende Zieldateien. Im Fall des Löschvorgangs versucht das System, die gelöschten Dateien in den Papierkorb zu speichern.

It is also possible to move files using the drag-and-drop functionality.

Um die Funktion zu verwenden, müssen Sie die Member einer SHFILEOPSTRUCT-Struktur ausfüllen und an SHFileOperationübergeben. Die Schlüsselmember der -Struktur sind pFrom und pTo.

Der pFrom-Member ist eine mit doppelt NULL endende Zeichenfolge, die einen oder mehrere Quelldateinamen enthält. Diese Namen können entweder vollqualifizierte Pfade oder STANDARD-DOS-Platzhalter wie * * sein. Obwohl dieser Member als null-terminierte Zeichenfolge deklariert ist, wird er als Puffer für mehrere Dateinamen verwendet. Jeder Dateiname muss durch das übliche einzelne NULL-Zeichen beendet werden. Ein zusätzliches NULL-Zeichen muss am Ende des endgültigen Namens angefügt werden, um das Ende von pFrom anzugeben.

Der pTo-Member ist eine doppelt null-terminierte Zeichenfolge, ähnlich wie pFrom. Der pTo-Member enthält die Namen von einem oder mehreren vollqualifizierten Zielnamen. Sie werden auf die gleiche Weise wie für pFrom in pTo gepackt. Wenn pTo mehrere Namen enthält, müssen Sie auch das FOF _ MULTIDESTFILES-Flag im fFlags-Member festlegen. Die Verwendung von pTo hängt vom Vorgang ab, wie hier beschrieben.

  • Wenn alle Dateien für Kopier- und Verschiebevorgänge in ein einzelnes Verzeichnis verschoben werden, enthält pTo den vollqualifizierten Verzeichnisnamen. Wenn die Dateien an andere 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 der Shell

Benachrichtigen Sie die Shell über die Änderung, nachdem Sie SHFileOperation zum Verschieben, Kopieren, Umbenennen oder Löschen von Dateien verwendet oder eine andere Aktion ausgeführt haben, die sich auf den Namespace auswirkt. Aktionen, die von Benachrichtigungen begleitet werden sollten, umfassen 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.

Einfaches Beispiel für das Verwalten von Dateien mit SHFileOperation

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 in der Anwendung hart codiert.

#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 zunächst 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 ist. Die Anwendung bindet dann an das Quellverzeichnis und verwendet die IShellFolder-Schnittstelle, um die IEnumIDList-Schnittstelle eines Enumeratorobjekts abzurufen.

Da jede Datei im Quellverzeichnis aufzählt, wird IShellFolder::GetDisplayNameOf verwendet, um ihren Namen abzurufen. Das SWSDN _ FORPARSING-Flag ist festgelegt, wodurch IShellFolder::GetDisplayNameOf den vollqualifizierten Pfad der Datei zurückgibt. Die Dateipfade, einschließlich der abschließenden NULL-Zeichen, werden zu einem einzelnen Array verkettet, szSourceFiles. Ein zweites NULL-Zeichen wird an den endgültigen Pfad angefügt, um das Array ordnungsgemäß zu beenden.

Nach Abschluss der Enumeration weist die Anwendung einer SHFILEOPSTRUCT-Struktur Werte zu. Beachten Sie, dass das Array, das pTo zum Angeben des Ziels zugewiesen ist, ebenfalls mit einem doppelten NULL-Wert beendet werden muss. In diesem Fall ist sie einfach in der Zeichenfolge enthalten, die pTo zugewiesen ist. Da es sich um eine Konsolenanwendung handelt, werden die Flags FOF _ SILENT, FOF _ NOCONFIRMATION und FOF _ NOCONFIRMMKDIR so festgelegt, dass alle angezeigten Dialogfelder unterdrückt werden. 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.

Hinzufügen von Dateien zur Shellliste zuletzt verwendeter Dokumente

Die Shell verwaltet eine Liste der zuletzt hinzugefügten oder geänderten Dokumente für jeden Benutzer. Der Benutzer kann eine Liste mit Links zu diesen Dateien anzeigen, indem er auf der Startmenü auf Dokumente klickt. Wie bei Eigene Dokumente verfügt jeder Benutzer über ein Dateisystemverzeichnis, in dem die tatsächlichen Links gespeichert werden können. Um die PIDL des Zuletzt verwendeten Verzeichnisses des aktuellen Benutzers abzurufen, kann Ihre Anwendung SHGetFolderLocation mit CSIDL _ RECENT aufrufen oder SHGetFolderPath aufrufen, um seinen Pfad abzurufen.

Ihre Anwendung kann den Inhalt des Ordners Zuletzt verwendet mithilfe der weiter oben in diesem Dokument beschriebenen Verfahren aufzählen. Eine Anwendung sollte den Inhalt des Ordners jedoch nicht so ändern, als wäre es ein normaler Dateisystemordner. In diesem Falle wird die Shell-Liste der zuletzt veröffentlichten Dokumente nicht ordnungsgemäß aktualisiert, und die Änderungen werden nicht im Startmenü widergespiegelt. Um stattdessen einen Dokumentlink zum Ordner Zuletzt verwendet eines Benutzers hinzuzufügen, kann Ihre Anwendung SHAddToRecentDocsaufrufen. Die Shell fügt einen Link zum entsprechenden Dateisystemordner hinzu und aktualisiert die Liste der zuletzt verwendeten Dokumente und die Startmenü. Sie können diese Funktion auch verwenden, um den Ordner zu löschen.