Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Shell tillhandahåller ett antal sätt att hantera filsystem. Shell tillhandahåller en funktion, SHFileOperation, som gör att ett program programmässigt kan flytta, kopiera, byta namn på och ta bort filer. Shell stöder även vissa ytterligare filhanteringsfunktioner.
- HTML-dokument kan anslutas till relaterade filer, till exempel grafikfiler eller formatmallar. När dokumentet flyttas eller kopieras flyttas eller kopieras även de anslutna filerna automatiskt.
- För system som är tillgängliga för fler än en användare kan filer hanteras per användare. Användare har enkel åtkomst till sina datafiler, men inte till filer som tillhör andra användare.
- Om dokumentfiler läggs till eller ändras kan de läggas till i Shells lista över de senaste dokumenten. När användaren klickar på kommandot Dokument på Start-menyn visas en lista med länkar till dokumenten.
I det här dokumentet beskrivs hur dessa filhanteringstekniker fungerar. Den beskriver sedan hur du använder Gränssnittet för att flytta, kopiera, byta namn på och ta bort filer och hur du hanterar objekt i papperskorgen.
- Per-User Filhantering
- Mina dokument och Mina bildmappar
- Anslutna filer
- flytta, kopiera, byta namn på och ta bort filer
- enkelt exempel på hantering av filer med SHFileOperation
- Lägga till filer i gränssnittets lista över senaste dokument
Per-User Filhantering
Windows 2000 Shell tillåter att filer associeras med en viss användare så att filerna förblir dolda för andra användare. När det gäller filsystemet lagras filerna under användarens profilmapp, vanligtvis C:\Dokument och inställningar\Användarnamn\ på Windows 2000-system. Den här funktionen gör att många personer kan använda samma dator, samtidigt som de upprätthåller sekretessen för sina filer från andra användare. Olika användare kan ha olika program tillgängliga. Det är också ett enkelt sätt för administratörer och program att lagra sådant som initiering (.ini) eller länkfiler (.lnk). Program kan därmed bevara ett annat tillstånd för varje användare och enkelt återställa det specifika tillståndet när det behövs. Det finns också en profilmapp för lagring av information som är gemensam för alla användare.
Eftersom det är obekvämt att avgöra vilken användare som är inloggad och var deras filer finns, är standardmapparna per användare särskilda mappar och identifieras av en CSIDL-. Till exempel är CSIDL för mappen programfiler per användare CSIDL_PROGRAMS. Om programmet anropar SHGetFolderLocation eller SHGetFolderPath med någon av CSIDL:erna per användare, returnerar funktionen pekaren till en lista över objektidentifierare (PIDL) eller sökväg som är lämplig för den inloggade användaren. Om ditt program behöver hämta sökvägen eller PIDL till profilmappen är dess CSIDL definierad som CSIDL_PROFILE.
Mina dokument och mina bildmappar
En av standardikonerna på skrivbordet är Mina dokument. När du öppnar den här mappen innehåller den den aktuella användarens dokumentfiler. Skrivbordsinstansen av Mina dokument är en virtuell mapp – ett alias till filsystemplatsen som används för att fysiskt lagra användarens dokument – som finns direkt under skrivbordet i namnområdeshierarkin.
Syftet med mapparna Mina dokument och Mina bilder är att tillhandahålla ett enkelt och säkert sätt för användare att komma åt sina dokument- och bildfiler i ett system som kan ha flera användare. Varje användare tilldelas separata filsystemmappar för sina filer. Till exempel är platsen för en användares dokumentmapp i filsystemet vanligtvis ungefär som C:\Dokument och inställningar\användarnamn\Mina dokument. Användarna behöver inte veta något om den fysiska platsen för sina filsystemmappar. De kommer helt enkelt åt sina filer via ikonen Mina dokument.
Not
Mina dokument ger en användare åtkomst till sina egna filer, men inte andra användares filer. Om flera personer använder samma dator kan en administratör låsa användarna från den del av filsystemet där de faktiska filerna lagras. Användarna kommer därför att kunna arbeta med sina egna dokument via mappen Mina dokument, men inte på dokument som tillhör andra användare.
Det finns vanligtvis inget behov av att ett program vet vilken användare som är inloggad eller var i filsystemet som användarens mappen Mina dokument finns. I stället kan programmet hämta PIDL:en för skrivbordsikonen Mina Dokument genom att anropa skrivbordets IShellFolder::ParseDisplayName-metod. Det parsningsnamn som används för att identifiera mappen Mina dokument är inte en filsökväg, utan snarare ::{450d8fba-ad25-11d0-98a8-0800361b1103}. Det hakparenteserade uttrycket är textformen för GUID:et Mina dokument. Om du till exempel vill hämta PIDL för Mina dokument ska ditt program använda det här anropet för att IShellFolder::ParseDisplayName.
hr = psfDeskTop->ParseDisplayName(NULL,
NULL,
L"::{450d8fba-ad25-11d0-98a8-0800361b1103}",
&chEaten,
&pidlDocFiles,
NULL);
När ditt program har PIDL:n Mina dokument kan den hantera mappen på samma sätt som en vanlig filsystemmapp– räkna upp objekt, parsa, binda och utföra andra giltiga mappåtgärder. Shell mappar automatiskt ändringar i Mina dokument eller dess undermappar till lämpliga filsystemmappar.
Om programmet behöver åtkomst till den faktiska filsystemmappen som innehåller den aktuella användarens dokument skickar du CSIDL_PERSONAL till SHGetFolderLocation. Funktionen returnerar PIDL för filsystemmappen som visas i den aktuella användarens mapp Mina dokument.
Anslutna filer
HTML-dokument har ofta ett antal associerade grafikfiler, en formatmallsfil, flera Microsoft JScript-filer (kompatibla med ECMA 262-språkspecifikation) och så vidare. När du flyttar eller kopierar det primära HTML-dokumentet vill du också vanligtvis flytta eller kopiera dess associerade filer för att undvika att länkarna bryts. Tyvärr har det inte funnits något enkelt sätt hittills att avgöra vilka filer som är relaterade till ett visst HTML-dokument än genom att analysera deras innehåll. För att lösa det här problemet erbjuder Windows 2000 ett enkelt sätt att koppla ett primärt HTML-dokument till dess grupp av associerade filer. Om filanslutningen är aktiverad följer alla anslutna filer med när dokumentet flyttas eller kopieras.
Om du vill skapa en grupp med anslutna filer måste det primära dokumentet ha ett .htm- eller .html filnamnstillägg. Skapa en undermapp till det primära dokumentets överordnade mapp. Undermappens namn måste vara namnet på det primära dokumentet, minus .htm eller .html tillägg, följt av ett av tilläggen som anges nedan. De vanligaste tilläggen är ".files" eller "_files". Om det primära dokumentet till exempel heter MyDoc.htmdefinierar namngivning av undermappen "MyDoc_files" undermappen som container för dokumentets anslutna filer. Om det primära dokumentet flyttas eller kopieras flyttas eller kopieras även undermappen och dess filer.
För vissa språk är det möjligt att använda en lokaliserad motsvarighet till "_files" för att skapa en undermapp för anslutna filer. I följande tabell visas de giltiga strängar som kan läggas till i ett dokumentnamn för att skapa en undermapp för anslutna filer. Observera att vissa av dessa strängar har "-" som sitt första tecken i stället för '_' eller '.'.
"_archivos"
"_arquivos"
"_bestanden"
"_bylos"
"-Dateien"
"_datoteke"
"_dosyalar"
"_elemei"
"_failid"
_misslyckas
"_fajlovi"
"_ficheiros"
"_fichiers"
"-filer"
.files
"_files"
"_file"
"_fitxers"
"_fitxategiak"
"_pliki"
"_soubory"
"_filer"
Notera
Den här funktionen är känslig för tilläggets fall. För exemplet ovan ansluts till exempel inte en undermapp med namnet "MyDoc_Files" till MyDoc.htm.
Om filanslutningen är aktiverad eller inaktiverad styrs av ett REG_DWORD värde, NoFileFolderConnection, för följande registernyckel.
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Explorer
Det här värdet är normalt inte definierat och filanslutningen är aktiverad. Om det behövs kan du inaktivera filanslutningen genom att lägga till det här värdet i nyckeln och ange den till 1. Om du vill aktivera filanslutningen igen anger du NoFileFolderConnection till noll.
Not
Filanslutning bör normalt aktiveras eftersom andra program kan vara beroende av den. Inaktivera endast filanslutning om det är absolut nödvändigt.
Flytta, kopiera, byta namn på och ta bort filer
Namnområdet är inte statiskt och program behöver vanligtvis hantera filsystemet genom att utföra någon av följande åtgärder.
- Kopierar ett objekt till en annan mapp.
- Flytta ett objekt till en annan mapp.
- Tar bort ett objekt.
- Byter namn på ett objekt.
Alla dessa åtgärder utförs med SHFileOperation. Den här funktionen tar en eller flera källfiler och skapar motsvarande målfiler. När det gäller borttagningsåtgärden försöker systemet placera de borttagna filerna i papperskorgen.
Det går också att flytta filer med hjälp av funktionen dra och släpp.
Om du vill använda funktionen måste du fylla i medlemmarna i en SHFILEOPSTRUCT- struktur och skicka den till SHFileOperation. De viktigaste medlemmarna i strukturen är pFrom och pTo.
pFrom medlem är en dubbel null-terminated-sträng som innehåller ett eller flera källfilnamn. Dessa namn kan vara antingen fullständigt kvalificerade sökvägar eller standard-DOS-jokertecken, till exempel *.*. Även om den här medlemmen deklareras som en null--terminated-sträng används den som en buffert för att lagra flera filnamn. Varje filnamn måste avslutas med det vanliga NULL- tecken. Ytterligare ett NULL- tecken måste läggas till i slutet av det slutliga namnet för att ange slutet på pFrom.
pTo- medlem är en dubbel null--avslutad sträng, ungefär som pFrom. pTo--medlemmet innehåller namnen på ett eller flera fullständigt kvalificerade målnamn. De packas i pTo på samma sätt som för pFrom. Om pTo innehåller flera namn måste du också ange flaggan FOF_MULTIDESTFILES i fFlags medlem. Användningen av pTo beror på åtgärden enligt beskrivningen här.
- Om alla filer ska till en enda katalog för kopierings- och flyttåtgärder pTo- innehåller det fullständigt kvalificerade katalognamnet. Om filerna går till olika mål kan pTo- också innehålla en fullständigt kvalificerad katalog eller filnamn för varje källfil. Om det inte finns någon katalog skapar systemet den.
- För namnändringsåtgärder innehåller pTo en fullständiga kvalificerade sökvägar för varje källfil i pFrom.
- För borttagningsåtgärder används inte pTo-.
Meddela skalet
Meddela Shell om ändringen när du har använt SHFileOperation för att flytta, kopiera, byta namn på eller ta bort filer eller efter att ha vidtagit någon annan åtgärd som påverkar namnområdet. Åtgärder som ska åtföljas av meddelanden omfattar följande:
- Lägga till eller ta bort filer eller mappar.
- Flytta, kopiera eller byta namn på filer eller mappar.
- Ändra en filassociation.
- Ändra filattribut.
- Lägga till eller ta bort enheter eller lagringsmedia.
- Skapa eller inaktivera en delad mapp.
- Ändra systembildlistan.
Ett program meddelar Shell genom att anropa SHChangeNotify med information om vad som har ändrats. Shell kan sedan uppdatera sin avbildning av namnområdet för att korrekt återspegla dess nya tillstånd.
Enkelt exempel på hantering av filer med SHFileOperation
Följande exempelkonsolprogram illustrerar användningen av SHFileOperation- för att kopiera filer från en katalog till en annan. Käll- och målkatalogerna C:\My_Docs och C:\My_Docs2 är hårdkodade i programmet för enkelhetens skull.
#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;
}
Programmet hämtar först en pekare till skrivbordets IShellFolder- gränssnitt. Den hämtar sedan källkatalogens PIDL genom att skicka den fullständigt kvalificerade sökvägen till IShellFolder::ParseDisplayName. Observera att IShellFolder::P arseDisplayName kräver att katalogens sökväg är en Unicode-sträng. Programmet binder sedan till källkatalogen och använder sitt IShellFolder--gränssnitt för att hämta ett uppräkningsobjekts IEnumIDList--gränssnitt.
När varje fil i källkatalogen räknas upp används IShellFolder::GetDisplayNameOf för att hämta namnet. Flaggan SHGDN_FORPARSING anges, vilket gör att IShellFolder::GetDisplayNameOf returnerar filens fullständigt kvalificerade sökväg. Filsökvägarna, inklusive avslutande NULL- tecken, sammanfogas till en enda matris, szSourceFiles. Ett andra NULL tecken läggs till i den sista sökvägen för att avsluta matrisen korrekt.
När uppräkningen är klar tilldelar programmet värden till en SHFILEOPSTRUCT- struktur. Observera att matrisen som tilldelats pTo för att ange målet också måste avslutas med en dubbel NULL-. I det här fallet ingår den helt enkelt i strängen som är tilldelad till pTo. Eftersom det här är ett konsolprogram är flaggorna FOF_SILENT, FOF_NOCONFIRMATION och FOF_NOCONFIRMMKDIR inställda på att utelämna eventuella dialogrutor som kan visas. När SHFileOperation returnerar anropas SHChangeNotify för att meddela Shell om ändringen. Sedan utför programmet den vanliga rensningen och returnerar.
Lägga till filer i Gränssnittets lista över senaste dokument
Shell har en lista över nyligen tillagda eller ändrade dokument för varje användare. Användaren kan visa en lista med länkar till dessa filer genom att klicka på Dokument på Start-menyn. Precis som med Mina dokument har varje användare en filsystemkatalog som innehåller de faktiska länkarna. Om du vill hämta PIDL för den aktuella användarens senaste katalog kan programmet anropa SHGetFolderLocation med CSIDL_RECENT eller anropa SHGetFolderPath för att hämta sökvägen.
Ditt program kan räkna upp innehållet i mappen Senaste med hjälp av de tekniker som beskrivs tidigare i det här dokumentet. Ett program bör dock inte ändra innehållet i mappen som om det vore en vanlig filsystemmapp. Om det gör det uppdateras inte Shells lista över de senaste dokumenten korrekt och ändringarna återspeglas inte på Start-menyn. Om du i stället vill lägga till en dokumentlänk i en användares senaste mapp kan programmet anropa SHAddToRecentDocs. Shell lägger till en länk till lämplig filsystemmapp, samt uppdaterar sin lista över de senaste dokumenten och Start-menyn. Du kan också använda den här funktionen för att rensa mappen.