Het bestandssysteem beheren
De Shell biedt een aantal manieren om bestandssystemen te beheren. De Shell biedt een functie, SHFileOperation-, waarmee een toepassing bestanden programmatisch kan verplaatsen, kopiëren, hernoemen en verwijderen. De Shell biedt ook ondersteuning voor enkele extra mogelijkheden voor bestandsbeheer.
- HTML-documenten kunnen worden verbonden met gerelateerde bestanden, zoals grafische bestanden of stijlbladen. Wanneer het document wordt verplaatst of gekopieerd, worden de verbonden bestanden ook automatisch verplaatst of gekopieerd.
- Voor systemen die beschikbaar zijn voor meer dan één gebruiker, kunnen bestanden per gebruiker worden beheerd. Gebruikers hebben eenvoudig toegang tot hun gegevensbestanden, maar niet tot bestanden die tot andere gebruikers behoren.
- Als documentbestanden worden toegevoegd of gewijzigd, kunnen ze worden toegevoegd aan de lijst met recente documenten van de Shell. Wanneer de gebruiker op de opdracht Documenten in het menu Start klikt, wordt er een lijst met koppelingen naar de documenten weergegeven.
In dit document wordt beschreven hoe deze bestandsbeheertechnologieën werken. Vervolgens wordt beschreven hoe u de Shell kunt gebruiken om bestanden te verplaatsen, te kopiëren, te wijzigen en te verwijderen en hoe u objecten in de Prullenbak beheert.
- Per-User bestandsbeheer
- mijn documenten en mappen met mijn afbeeldingen
- verbonden bestanden
- bestanden verplaatsen, kopiëren, hernoemen en verwijderen
- eenvoudig voorbeeld van het beheren van bestanden met SHFileOperation
- Bestanden toevoegen aan de lijst met recente documenten van de Shell
bestandsbeheer Per-User
Met de Windows 2000 Shell kunnen bestanden worden gekoppeld aan een bepaalde gebruiker, zodat de bestanden verborgen blijven voor andere gebruikers. In termen van het bestandssysteem worden de bestanden opgeslagen in de profielmap van de gebruiker, meestal C:\Documents and Settings\Gebruikersnaam\ op Windows 2000-systemen. Met deze functie kunnen veel personen dezelfde computer gebruiken, terwijl ze de privacy van hun bestanden van andere gebruikers behouden. Verschillende gebruikers kunnen verschillende programma's beschikbaar hebben. Het biedt ook een eenvoudige manier voor beheerders en toepassingen om dingen als initialisatiebestanden (.ini) of koppelingsbestanden (.lnk) op te slaan. Toepassingen kunnen dus voor elke gebruiker een andere status behouden en deze specifieke status eenvoudig herstellen wanneer dat nodig is. Er is ook een profielmap voor het opslaan van informatie die gebruikelijk is voor alle gebruikers.
Omdat het onhandig is om te bepalen welke gebruiker is aangemeld en waar de bestanden zich bevinden, zijn de standaardmappen per gebruiker speciale mappen en worden geïdentificeerd door een CSIDL-. De CSIDL voor de map Program Files per gebruiker is bijvoorbeeld CSIDL_PROGRAMS. Als uw toepassing SHGetFolderLocation of SHGetFolderPath aanroept met een van de CSIDLs per gebruiker, retourneert de functie de aanwijzer naar een lijst met item-id's (PIDL) of het pad dat geschikt is voor de momenteel aangemelde gebruiker. Als het nodig is dat uw toepassing het pad of de PIDL van de profielmap ophaalt, is de CSIDL CSIDL_PROFILE.
Mijn documenten en mijn afbeeldingenmappen
Een van de standaardpictogrammen op het bureaublad is Mijn documenten. Wanneer u deze map opent, bevat deze de documentbestanden van de huidige gebruiker. Het bureaubladexemplaren van Mijn documenten zijn een virtuele map, een alias naar de locatie van het bestandssysteem die wordt gebruikt om de documenten van de gebruiker fysiek op te slaan, direct onder het bureaublad in de naamruimtehiërarchie.
Het doel van de mappen Mijn documenten en Mijn afbeeldingen is om gebruikers een eenvoudige en veilige manier te bieden om toegang te krijgen tot hun document- en afbeeldingsbestanden op een systeem dat meerdere gebruikers kan hebben. Aan elke gebruiker worden afzonderlijke bestandssysteemmappen toegewezen voor zijn of haar bestanden. Zo is de locatie van de map documenten van een gebruiker in het bestandssysteem meestal ongeveer C:\Documents and Settings\gebruikersnaam\Mijn documenten. Gebruikers hoeven niets te weten te komen over de fysieke locatie van hun bestandssysteemmappen. Ze hebben gewoon toegang tot hun bestanden via het pictogram Mijn documenten.
Notitie
Met Mijn documenten kan een gebruiker toegang krijgen tot zijn of haar eigen bestanden, maar niet tot die van een andere gebruiker. Als meerdere personen dezelfde computer gebruiken, kan een beheerder gebruikers vergrendelen uit het deel van het bestandssysteem waarin de werkelijke bestanden worden opgeslagen. Gebruikers kunnen dus aan hun eigen documenten werken via de map Mijn documenten, maar niet op documenten die tot andere gebruikers behoren.
Er is meestal geen toepassing nodig om te weten welke gebruiker is aangemeld of waar zich in het bestandssysteem de map Mijn documenten van de gebruiker bevindt. In plaats daarvan kan uw toepassing de PIDL van het bureaubladpictogram Mijn Documenten ophalen door de methode IShellFolder::ParseDisplayName op het bureaublad aan te roepen. De parseringsnaam die wordt gebruikt om de map Mijn documenten te identificeren, is geen bestandspad, maar eerder ::{450d8fba-ad25-11d0-98a8-0800361b1103}. De expressie met vierkante haken is de tekstvorm van de GUID Mijn documenten. Als u bijvoorbeeld de PIDL van Mijn Documenten wilt ophalen, moet uw toepassing deze aanroep gebruiken om IShellFolder::ParseDisplayName.
hr = psfDeskTop->ParseDisplayName(NULL,
NULL,
L"::{450d8fba-ad25-11d0-98a8-0800361b1103}",
&chEaten,
&pidlDocFiles,
NULL);
Zodra uw toepassing de PIDL Mijn documenten heeft, kan deze de map net zo verwerken als een normale bestandssysteemmap, waarbij items worden opgesomd, geparseerd, binding en andere geldige mapbewerkingen worden uitgevoerd. In De Shell worden wijzigingen in Mijn documenten of de bijbehorende submappen automatisch toegewezen aan de juiste mappen van het bestandssysteem.
Als uw toepassing toegang nodig heeft tot de daadwerkelijke bestandssysteemmap die de documenten van de huidige gebruiker bevat, geeft u CSIDL_PERSONAL door aan SHGetFolderLocation-. De functie retourneert de PIDL van de bestandssysteemmap die wordt weergegeven in de map Mijn documenten van de huidige gebruiker.
Verbonden bestanden
HTML-documenten hebben vaak een aantal gekoppelde grafische bestanden, een opmaakmodelbestand, verschillende Microsoft JScript-bestanden (compatibel met ECMA 262-taalspecificatie) enzovoort. Wanneer u het primaire HTML-document verplaatst of kopieert, wilt u meestal ook de bijbehorende bestanden verplaatsen of kopiëren om koppelingen die fouten veroorzaken te voorkomen. Helaas is er tot nu toe geen eenvoudige manier geweest om te bepalen welke bestanden zijn gerelateerd aan een bepaald HTML-document, behalve door de inhoud ervan te analyseren. Om dit probleem te verhelpen, biedt Windows 2000 een eenvoudige manier om verbinding te maken een primair HTML-document met de bijbehorende bestanden. Als bestandsverbinding is ingeschakeld, gaan alle bijbehorende bestanden mee wanneer het document wordt verplaatst of gekopieerd.
Als u een groep verbonden bestanden wilt maken, moet het primaire document een .htm of .html bestandsnaamextensie hebben. Maak een submap van de bovenliggende map van het primaire document. De naam van de submap moet de naam van het primaire document zijn, minus de .htm of .html extensie, gevolgd door een van de onderstaande extensies. De meest gebruikte extensies zijn '.files' of '_files'. Als het primaire document bijvoorbeeld de naam MyDoc.htmheeft, wordt met de naam van de submap 'MyDoc_files' de submap gedefinieerd als de container voor de verbonden bestanden van het document. Als het primaire document wordt verplaatst of gekopieerd, worden de submap en de bijbehorende bestanden ook verplaatst of gekopieerd.
Voor sommige talen is het mogelijk om een gelokaliseerd equivalent van '_files' te gebruiken om een submap te maken voor verbonden bestanden. De volgende tabel bevat de geldige tekenreeksen die kunnen worden toegevoegd aan een documentnaam om een submap voor verbonden bestanden te maken. Sommige van deze tekenreeksen hebben '-' als hun eerste teken in plaats van '_' of '.'.
"_archivos"
"_arquivos"
"_bestanden"
"_bylos"
"-Dateien"
"_datoteke"
"_dosyalar"
"_elemei"
"_failid"
"_faalt"
"_fajlovi"
"_ficheiros"
"_fichiers"
"-filer"
".files"
"_bestanden"
"_file"
"_fitxers"
"_fitxategiak"
"_pliki"
"_soubory"
"_tiedostot"
Notitie
Deze functie is gevoelig voor het geval van de extensie. In het bovenstaande voorbeeld wordt bijvoorbeeld een submap met de naam 'MyDoc_Files' niet verbonden met MyDoc.htm.
Of de bestandsverbinding is ingeschakeld of uitgeschakeld, wordt bepaald door de REG_DWORD-waarde, NoFileFolderConnection, van de volgende registersleutel.
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Explorer
Deze waarde is normaal gesproken niet gedefinieerd en de bestandsverbinding is ingeschakeld. Indien nodig kunt u de bestandsverbinding uitschakelen door deze waarde toe te voegen aan de sleutel en deze in te stellen op 1. Als u de bestandsverbinding opnieuw wilt inschakelen, stelt u NoFileFolderConnection in op nul.
Notitie
Bestandsverbinding moet normaal gesproken worden ingeschakeld omdat andere toepassingen hiervan afhankelijk kunnen zijn. Schakel de bestandsverbinding alleen uit als dit absoluut noodzakelijk is.
Bestanden verplaatsen, kopiëren, hernoemen en verwijderen
De naamruimte is niet statisch en toepassingen moeten het bestandssysteem meestal beheren door een van de volgende bewerkingen uit te voeren.
- Een object kopiëren naar een andere map.
- Een object verplaatsen naar een andere map.
- Een object verwijderen.
- De naam van een object wijzigen.
Deze bewerkingen worden allemaal uitgevoerd met SHFileOperation-. Deze functie gebruikt een of meer bronbestanden en produceert bijbehorende doelbestanden. In het geval van de verwijderbewerking probeert het systeem de verwijderde bestanden in de Prullenbak te plaatsen.
Het is ook mogelijk om bestanden te verplaatsen met behulp van de functionaliteit voor slepen en neerzetten.
Als u de functie wilt gebruiken, moet u de leden van een SHFILEOPSTRUCT structuur invullen en doorgeven aan SHFileOperation-. De belangrijkste leden van de structuur zijn pFrom en pTo.
Het pFrom lid is een dubbele null--beëindigde tekenreeks die een of meer bronbestandsnamen bevat. Deze namen kunnen volledig gekwalificeerde paden of standaard DOS-jokertekens zijn, zoals *.*. Hoewel dit lid wordt gedeclareerd als een null--beëindigde tekenreeks, wordt het gebruikt als buffer voor het opslaan van meerdere bestandsnamen. Elke bestandsnaam moet worden beëindigd door het gebruikelijke enkele NULL- teken. Een extra NULL karakter moet aan het einde van de laatste naam worden toegevoegd om het einde van pFromaan te geven.
Het pTo lid is een dubbele null-tekenreeks-beëindigd, net als pFrom. De pTo element bevat de namen van een of meer volledig gespecificeerde doelnamen. Ze zijn verpakt in pTo op dezelfde manier als voor pFrom. Als pTo meerdere namen bevat, moet u ook de FOF_MULTIDESTFILES vlag instellen in de fFlags lid. Het gebruik van pTo is afhankelijk van de bewerking zoals hier wordt beschreven.
- Voor kopieer- en verplaatsingsbewerkingen, als alle bestanden naar één map gaan, pTo- de volledig gekwalificeerde mapnaam bevat. Als de bestanden naar verschillende bestemmingen gaan, kan pTo- ook één volledig gekwalificeerde map of bestandsnaam voor elk bronbestand bevatten. Als er geen map bestaat, wordt deze door het systeem gemaakt.
- Voor naamswijzigingsbewerkingen bevat pTo- één volledig gekwalificeerd pad voor elk bronbestand in pFrom.
- Voor verwijderbewerkingen wordt pTo- niet gebruikt.
De Shell op de hoogte stellen
Informeer de Shell van de wijziging nadat u SHFileOperation- hebt gebruikt om bestanden te verplaatsen, te kopiëren, te wijzigen of te verwijderen, of nadat u een andere actie hebt uitgevoerd die van invloed is op de naamruimte. Acties die vergezeld moeten gaan van een kennisgeving zijn onder andere:
- Bestanden of mappen toevoegen of verwijderen.
- Bestanden of mappen verplaatsen, kopiëren of de naam ervan wijzigen.
- Een bestandskoppeling wijzigen.
- Bestandskenmerken wijzigen.
- Schijven of opslagmedia toevoegen of verwijderen.
- Een gedeelde map maken of uitschakelen.
- De systeemimagelijst wijzigen.
Een toepassing meldt de Shell door SHChangeNotify- aan te roepen met de details van wat er is gewijzigd. De Shell kan vervolgens de afbeelding van de naamruimte bijwerken om de nieuwe status nauwkeurig weer te geven.
Eenvoudig voorbeeld van het beheren van bestanden met SHFileOperation
De volgende voorbeeldconsoletoepassing illustreert het gebruik van SHFileOperation- om bestanden van de ene map naar de andere te kopiëren. De bron- en doelmappen, C:\My_Docs en C:\My_Docs2, zijn vastgelegd in de toepassing om het eenvoudig te maken.
#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;
}
De toepassing haalt eerst een aanwijzer op naar de IShellFolder-interface van het bureaublad. Vervolgens haalt het de PIDL van de bronmap op door het volledig gekwalificeerde pad door te geven aan IShellFolder::ParseDisplayName. Houd er rekening mee dat IShellFolder::P arseDisplayName vereist dat het pad van de map een Unicode-tekenreeks is. De toepassing bindt vervolgens aan de bronmap en gebruikt de IShellFolder-interface om de IEnumIDList-interface van een enumerator-object op te halen.
Aangezien elk bestand in de bronmap wordt geïnventariseerd, wordt IShellFolder::GetDisplayNameOf gebruikt om de naam op te halen. De vlag SHGDN_FORPARSING is ingesteld, waardoor IShellFolder::GetDisplayNameOf het volledig gekwalificeerde pad van het bestand retourneert. De bestandspaden, inclusief de afsluitende NULL-tekens, worden samengevoegd in één matrix, szSourceFiles. Een tweede NULL- teken wordt aan het laatste pad toegevoegd om de reeks correct te beëindigen.
Zodra de opsomming is voltooid, wijst de toepassing waarden toe aan een SHFILEOPSTRUCT structuur. Houd er rekening mee dat de matrix die is toegewezen aan pTo om de bestemming op te geven, ook moet worden beëindigd door een dubbele NULL. In dit geval wordt deze gewoon opgenomen in de tekenreeks die is toegewezen aan pTo. Omdat dit een consoletoepassing is, worden de FOF_SILENT, FOF_NOCONFIRMATION en FOF_NOCONFIRMMKDIR vlaggen ingesteld om dialoogvensters te onderdrukken die kunnen worden weergegeven. Nadat SHFileOperation is geretourneerd, wordt SHChangeNotify- aangeroepen om de Shell op de hoogte te stellen van de wijziging. Vervolgens voert de toepassing de gebruikelijke opschoning uit en keert hij terug.
Bestanden toevoegen aan de lijst met recente documenten van de Shell
De Shell onderhoudt een lijst met onlangs toegevoegde of gewijzigde documenten voor elke gebruiker. De gebruiker kan een lijst met koppelingen naar deze bestanden weergeven door te klikken op Documenten in het menu Start. Net als bij Mijn documenten heeft elke gebruiker een bestandssysteemmap voor het opslaan van de werkelijke koppelingen. Als uw toepassing de PIDL van de Recente map van de huidige gebruiker wilt ophalen, kan het SHGetFolderLocation aanroepen met CSIDL_RECENT, of SHGetFolderPath aanroepen om het pad op te halen.
Uw toepassing kan de inhoud van de map Recent inventariseren met behulp van de technieken die eerder in dit document zijn besproken. Een toepassing mag de inhoud van de map echter niet wijzigen alsof deze een normale bestandssysteemmap is. Als dit het geval is, wordt de lijst met recente documenten van de Shell niet correct bijgewerkt en worden de wijzigingen niet doorgevoerd in het menu Start. Als u in plaats daarvan een documentkoppeling wilt toevoegen aan de map Recent van een gebruiker, kan uw toepassing SHAddToRecentDocs-aanroepen. De Shell voegt een koppeling toe naar de juiste bestandssysteemmap, evenals het bijwerken van de lijst met recente documenten en het menu Start. U kunt deze functie ook gebruiken om de map te wissen.