Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A Rendszerhéj számos módszert kínál a fájlrendszerek kezelésére. A Shell egy SHFileOperationfüggvényt biztosít, amely lehetővé teszi az alkalmazások számára a fájlok programozott áthelyezését, másolását, átnevezését és törlését. A Shell további fájlkezelési képességeket is támogat.
- A HTML-dokumentumok kapcsolódó fájlokhoz, például grafikus fájlokhoz vagy stíluslapokhoz csatlakoztathatók. A dokumentum áthelyezése vagy másolásakor a csatlakoztatott fájlok is automatikusan át lesznek helyezve vagy másolva.
- Egynél több felhasználó számára elérhető rendszerek esetén a fájlok felhasználónként kezelhetők. A felhasználók könnyen hozzáférhetnek az adatfájljaikhoz, más felhasználókhoz tartozó fájlokhoz azonban nem.
- Ha dokumentumfájlokat adnak hozzá vagy módosítanak, azok hozzáadhatók a Shell legutóbbi dokumentumainak listájához. Amikor a felhasználó a Start menü Dokumentumok parancsára kattint, megjelenik a dokumentumokra mutató hivatkozások listája.
Ez a dokumentum a fájlkezelési technológiák működését ismerteti. Ezután ismerteti, hogyan helyezhet át, másolhat, nevezhet át és törölhet fájlokat a Shell használatával, és hogyan kezelheti az objektumokat a Lomtárban.
- Per-User Fájlkezelés
- Saját dokumentumok és saját képek mappa
- csatlakoztatott fájlok
-
Fájlok áthelyezése, másolása, átnevezése és törlése
- A Shell értesítése
- Egyszerű példa a fájlok kezelésére az SHFileOperation használatával
- Fájlok hozzáadása a Rendszerhéj legutóbbi dokumentumok listájához
Per-User fájlkezelés
A Windows 2000 Rendszerhéj lehetővé teszi, hogy a fájlok egy adott felhasználóhoz legyenek társítva, így a fájlok rejtve maradnak a többi felhasználó elől. Ami a fájlrendszert illeti, a fájlok a felhasználó profilmappájában vannak tárolva, általában a C:\Documents and Settings\Felhasználónév\ alatt Windows 2000 rendszereken. Ez a funkció lehetővé teszi, hogy sok személy ugyanazt a számítógépet használja, miközben megőrzi a fájljaik védelmét más felhasználóktól. A különböző felhasználók különböző programokkal rendelkezhetnek. Emellett a rendszergazdák és alkalmazások számára is egyszerű módot kínál az inicializálási (.ini) vagy a csatolási (.lnk) fájlok tárolására. Az alkalmazások így minden felhasználó számára megőrizhetnek egy másik állapotot, és szükség esetén egyszerűen helyreállíthatják az adott állapotot. Van egy profilmappa is, amely az összes felhasználó számára gyakori információkat tárolja.
Mivel kényelmetlen meghatározni, hogy melyik felhasználó van bejelentkezve, és hol találhatók a fájljai, a felhasználónkénti standard mappák speciális mappák, amelyeket egy CSIDL-azonosít. A felhasználónkénti Program Files mappa CSIDL azonosítója például CSIDL_PROGRAMS. Ha az alkalmazás meghívja SHGetFolderLocation vagy SHGetFolderPath a felhasználónkénti CSIDL-ek egyikével, a függvény a mutatót egy, az aktuálisan bejelentkezett felhasználónak megfelelő elemazonosító-listára (PIDL) vagy elérési útra adja vissza. Ha az alkalmazásnak le kell kérnie a profilmappa elérési útját vagy PIDL-jét, akkor annak CSIDL-je a CSIDL_PROFILE.
Saját dokumentumok és saját képek mappái
Az asztalon található szokásos ikonok egyike Dokumentumok. A mappa megnyitásakor az aktuális felhasználó dokumentumfájljait tartalmazza. A Dokumentumok asztali példánya egy virtuális mappa – a felhasználó dokumentumainak fizikai tárolására használt fájlrendszerbeli hely aliasa – közvetlenül az asztal alatt, a névtérhierarchiában.
A Dokumentumok és képek mappa célja, hogy egyszerű és biztonságos módot biztosítson a felhasználók számára a dokumentum- és képfájlok elérésére egy olyan rendszeren, amely több felhasználóval rendelkezhet. Minden felhasználó külön fájlrendszermappákat kap a fájljaihoz. Például egy felhasználó dokumentummappájának helye a fájlrendszerben általában a C:\Documents and Settings\felhasználónéva \Dokumentumok mappához hasonló. A felhasználóknak nem kell tudniuk semmit a fájlrendszermappáik fizikai helyéről. Egyszerűen a Saját dokumentumok ikonon keresztül férnek hozzá a fájljaikhoz.
Jegyzet
A Dokumentumok funkcióval a felhasználó hozzáférhet saját fájljaihoz, más felhasználókéihoz azonban nem. Ha több személy is ugyanazt a számítógépet használja, a rendszergazda kizárhatja a felhasználókat a fájlrendszer azon részéből, ahol a tényleges fájlokat tárolják. A felhasználók így a Saját dokumentumok mappán keresztül dolgozhatnak saját dokumentumaikon, más felhasználókhoz tartozó dokumentumokon azonban nem.
Általában nincs szükség arra, hogy egy alkalmazás tudja, melyik felhasználó van bejelentkezve, vagy hol található a fájlrendszerben a felhasználó Saját dokumentumok mappája. Ehelyett az alkalmazás lekérheti a Saját dokumentumok asztali ikonjának PIDL-jét az asztal IShellFolder::ParseDisplayName metódus meghívásával. A Dokumentumok mappa azonosításához használt nevezéktani név nem fájlelérési út, hanem ::{450d8fba-ad25-11d0-98a8-0800361b1103}. A zárójelbe foglalt kifejezés a Saját dokumentumok GUID-jének szöveges formája. Például a Saját dokumentumok PIDL-jének lekéréséhez az alkalmazásnak ezt a hívást kell használnia az IShellFolder::ParseDisplayNamehívásához.
hr = psfDeskTop->ParseDisplayName(NULL,
NULL,
L"::{450d8fba-ad25-11d0-98a8-0800361b1103}",
&chEaten,
&pidlDocFiles,
NULL);
Miután az alkalmazás megkapta a Saját dokumentumok PIDL-t, ugyanúgy kezelheti a mappát, mint egy normál fájlrendszermappát – az elemek számbavételét, elemzését, kötését és bármely más érvényes mappaművelet elvégzését. A Shell automatikusan leképezi a Saját dokumentumok vagy az almappák módosításait a megfelelő fájlrendszermappákra.
Ha az alkalmazásnak hozzá kell férnie az aktuális felhasználó dokumentumait tartalmazó tényleges fájlrendszer mappához, adja át a CSIDL_PERSONAL-t a(z) SHGetFolderLocationfüggvénynek. A függvény annak a fájlrendszermappának a PIDL-jét adja vissza, amely az aktuális felhasználó Dokumentumok mappájában jelenik meg.
Csatlakoztatott fájlok
A HTML-dokumentumok gyakran számos kapcsolódó grafikus fájllal, stíluslapfájllal, több Microsoft JScript-fájllal (az ECMA 262 nyelvi specifikációval kompatibilis) fájlokkal rendelkeznek, és így tovább. Az elsődleges HTML-dokumentum áthelyezésekor vagy másolásakor általában a kapcsolódó fájlokat is át kell helyeznie vagy másolnia a hivatkozások feltörésének elkerülése érdekében. Sajnos eddig nem volt könnyű meghatározni, hogy mely fájlok kapcsolódnak egy adott HTML-dokumentumhoz, kivéve a tartalom elemzésével. A probléma enyhítése érdekében a Windows 2000 egyszerű módot kínál arra, az elsődleges HTML-dokumentumot a társított fájlok csoportjához csatlakoztatni. Ha a fájlkapcsolat engedélyezve van, a dokumentum áthelyezésekor vagy másolásakor az összes csatlakoztatott fájl együtt jár vele.
Csatlakoztatott fájlok csoportjának létrehozásához az elsődleges dokumentumnak .htm vagy .html fájlnévkiterjesztéssel kell rendelkeznie. Hozzon létre egy almappát az elsődleges dokumentum szülőmappájában. Az almappa nevének az elsődleges dokumentum nevével kell megegyeznie, a .htm vagy .html kiterjesztés nélkül, amelyhez az alább felsorolt kiterjesztések egyikét kell hozzáadni. A leggyakrabban használt bővítmények a ".files" vagy a "_files". Ha például az elsődleges dokumentum neve MyDoc.htm, az almappának a "MyDoc_files" elnevezése határozza meg az almappát a dokumentum csatlakoztatott fájljainak tárolójaként. Az elsődleges dokumentum áthelyezése vagy másolása esetén az almappát és annak fájljait is áthelyezi vagy átmásolja.
Egyes nyelvek esetében a "_files" honosított megfelelője használható almappák létrehozásához a csatlakoztatott fájlokhoz. Az alábbi táblázat felsorolja azokat az érvényes sztringeket, amelyek hozzáfűzhetők egy dokumentum nevéhez egy csatlakoztatott fájl almappájának létrehozásához. Vegye figyelembe, hogy ezen sztringek némelyike "-" karakterrel kezdődik, nem pedig "_" vagy "." karakterrel.
"_archivos"
"_arquivos"
"_bestanden"
"_bylos"
"-Dateien"
"_datoteke"
"_dosyalar"
"_elemei"
"_failid"
"_sikertelen"
"_fajlovi"
_fájlok
"_fichiers"
"-filer"
.files
"_fájlok"
"_fájl"
"_fitxers"
"_fitxategiak"
"_pliki"
"_soubory"
"_tiedostot"
Jegyzet
Ez a funkció érzékeny a bővítmény esetére. A fenti példában például egy "MyDoc_Files" nevű almappát nem csatlakoztatunk MyDoc.htm.
A fájlkapcsolat engedélyezését vagy tiltását a következő beállításkulcs NoFileFolderConnection nevű REG_DWORD értéke szabályozza.
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Explorer
Ez az érték általában nincs definiálva, és a fájlkapcsolat engedélyezve van. Szükség esetén letilthatja a fájlkapcsolatot úgy, hogy hozzáadja ezt az értéket a kulcshoz, és 1 értékre állítja. A fájlkapcsolat ismételt engedélyezéséhez állítsa a NoFileFolderConnection értéket nullára.
Jegyzet
A fájlkapcsolatot általában engedélyezni kell, mert más alkalmazások is függhetnek attól. Csak akkor tiltsa le a fájlkapcsolatot, ha feltétlenül szükséges.
Fájlok áthelyezése, másolása, átnevezése és törlése
A névtér nem statikus, és az alkalmazásoknak általában az alábbi műveletek egyikével kell kezelnie a fájlrendszert.
- Objektum másolása egy másik mappába.
- Objektum áthelyezése egy másik mappába.
- Objektum törlése.
- Objektum átnevezése.
Ezeket a műveleteket SHFileOperationhajtja végre. Ez a függvény egy vagy több forrásfájlt használ, és létrehozza a megfelelő célfájlokat. A törlési művelet esetén a rendszer megpróbálja a törölt fájlokat a Lomtárba helyezni.
A húzd és dobd funkcióval is áthelyezheti a fájlokat.
A függvény használatához ki kell töltenie egy SHFILEOPSTRUCT struktúra tagjait, és át kell adnia azt SHFileOperation. A struktúra fő tagjai pFrom és pTo.
A pFrom tag egy dupla nullvégződésű karakterlánc, amely egy vagy több forrásfájlnevet tartalmaz. Ezek a nevek lehetnek teljesen minősített elérési utak vagy szabványos DOS helyettesítő karakterek, például *.*. Bár ez a tag null-terminated sztringként van deklarálva, a rendszer pufferként használja több fájlnév tárolására. Minden fájlnévnek a szokásos egyetlen NULL karakterrel kell zárulnia. Egy további NULL karaktert kell hozzáfűzni a végső név végéhez, hogy jelezze pFromvégét.
A pTo tag kettős nullvégződésű sztring, hasonlóan pFrom. A pTo tag az egy vagy több teljesen megadott célnév nevét tartalmazza. A pTo ugyanúgy vannak csomagolva, mint pFrom. Ha pTo több nevet is tartalmaz, a FOF_MULTIDESTFILES jelölőt is be kell állítania a fFlags tagban. A pTo használata az itt leírt művelettől függ.
- Másolási és áthelyezési műveletek esetén, ha az összes fájl egyetlen könyvtárba kerül, pTo tartalmazza a teljes könyvtárnevet. Ha a fájlok különböző célhelyekre kerülnek, pTo is tartalmazhatnak egy teljesen minősített könyvtárat vagy fájlnevet minden forrásfájlhoz. Ha nem létezik könyvtár, a rendszer létrehozza azt.
- Átnevezési műveletek esetén pTo egy teljes elérési utat tartalmaz a pFromminden forrásfájljához.
- Törlési műveletek esetén a rendszer nem használja pTo.
A rendszerhéj értesítése
Értesítse a Shellt a változásról, miután SHFileOperation használatával fájlokat helyezhet át, másolhat, átnevezhet vagy törölhet, vagy ha bármilyen más, a névteret érintő műveletet hajt végre. Az értesítéshez mellékelendő műveletek közé tartoznak a következők:
- Fájlok vagy mappák hozzáadása vagy törlése.
- Fájlok vagy mappák áthelyezése, másolása vagy átnevezése.
- Fájltársítás módosítása.
- Fájlattribútumok módosítása.
- Meghajtók vagy tároló adathordozók hozzáadása vagy eltávolítása.
- Megosztott mappa létrehozása vagy letiltása.
- A rendszerképek listájának módosítása.
Egy alkalmazás értesíti a Rendszerhéjat, ha meghívja SHChangeNotify a módosított adatokkal. A Rendszerhéj ezután frissítheti a névtér képét, hogy pontosan tükrözze az új állapotát.
Egyszerű példa a fájlok SHFileOperation használatával történő kezelésére
Az alábbi mintakonzolalkalmazás bemutatja, hogy SHFileOperation használatával másolhat fájlokat az egyik könyvtárból a másikba. A forrás- és célkönyvtárak (C:\My_Docs és C:\My_Docs2) az egyszerűség kedvéért közvetlenül be vannak építve az alkalmazásba.
#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;
}
Az alkalmazás először lekéri az asztal IShellFolder felületére mutató mutatót. Ezután lekéri a forráskönyvtár PIDL-jét azáltal, hogy a teljes elérési utat átadja a IShellFolder::ParseDisplayNameszámára. Vegye figyelembe, hogy IShellFolder::P arseDisplayName megköveteli, hogy a könyvtár elérési útja Unicode-sztring legyen. Az alkalmazás ezután a forráskönyvtárhoz csatlakozik, és a IShellFolder felületével lekéri az enumerátorobjektum IEnumIDList felületét.
Mivel a forráskönyvtár minden fájlja enumerálva van, IShellFolder::GetDisplayNameOf a neve lekérésére szolgál. A SHGDN_FORPARSING jelző be van állítva, ami miatt IShellFolder::GetDisplayNameOf visszaadja a fájl teljes elérési útját. A fájlútvonalak, beleértve a NULL karaktereket is, egyetlen tömbbe vannak összefűzve, szSourceFiles. A tömb megfelelő leállításához egy második NULL karaktert fűzünk hozzá az útvonal végéhez.
Az enumerálás befejezése után az alkalmazás értékeket rendel egy SHFILEOPSTRUCT struktúrához. Vegye figyelembe, hogy a cél megadásához a pTo-hez hozzárendelt tömböt is dupla NULLvégjellel kell lezárni. Ebben az esetben egyszerűen bele van foglalva a pToparancshoz rendelt sztringben. Mivel ez egy konzolalkalmazás, a FOF_SILENT, FOF_NOCONFIRMATION és FOF_NOCONFIRMMKDIR jelzők úgy vannak beállítva, hogy letiltsa az esetlegesen megjelenő párbeszédpaneleket. Miután SHFileOperation visszatér, a rendszer meghívja SHChangeNotify, hogy értesítse a Rendszerhéjat a változásról. Ezután az alkalmazás elvégzi a szokásos tisztítást, és visszatér.
Fájlok hozzáadása a Rendszerhéj legutóbbi dokumentumok listájához
A Shell minden felhasználóhoz fenntartja a legutóbb hozzáadott vagy módosított dokumentumok listáját. A felhasználó megjelenítheti a fájlokra mutató hivatkozások listáját a Start menü Dokumentumok parancsára kattintva. A Saját dokumentumokhoz hasonlóan minden felhasználó rendelkezik egy fájlrendszerkönyvtárral a tényleges hivatkozások tárolásához. Az aktuális felhasználó Legutóbbi könyvtárának PIDL-jének lekéréséhez az alkalmazás meghívhatja SHGetFolderLocation CSIDL_RECENT, vagy meghívhatja SHGetFolderPath az elérési út lekéréséhez.
Az alkalmazás a dokumentum korábbi részében ismertetett technikákkal számba tudja sorolni a Legutóbbi mappa tartalmát. Az alkalmazásnak azonban nem szabad úgy módosítania a mappa tartalmát, mintha normál fájlrendszerbeli mappa lenne. Ha így tesz, a Rendszerhéj legutóbbi dokumentumainak listája nem frissül megfelelően, és a módosítások nem jelennek meg a Start menüben. Ehelyett ha dokumentumhivatkozást szeretne hozzáadni egy felhasználó Legutóbbi mappájához, az alkalmazás meghívhatja SHAddToRecentDocs. A Rendszerhéj hozzáad egy hivatkozást a megfelelő fájlrendszermappához, valamint frissíti a legutóbbi dokumentumok listáját és a Start menüt. Ezzel a függvénnyel is kiürítheti a mappát.