Aracılığıyla paylaş


Dosya Sistemini Yönetme

Shell, dosya sistemlerini yönetmek için çeşitli yollar sağlar. Kabuk, bir uygulamanın dosyaları program aracılığıyla taşımasına, kopyalamasına, yeniden adlandırmasına ve silmesine olanak tanıyan SHFileOperationbir işlev sağlar. Shell bazı ek dosya yönetimi özelliklerini de destekler.

  • HTML belgeleri, ilgili dosyalara, örneğin, grafik dosyaları veya stil sayfalarına bağlı. Belge taşındığında veya kopyalandığında, bağlı dosyalar da otomatik olarak taşınır veya kopyalanır.
  • Birden fazla kullanıcının kullanımına sunulan sistemler için dosyalar kullanıcı başına yönetilebilir. Kullanıcılar veri dosyalarına kolayca erişebilir, ancak diğer kullanıcılara ait dosyalara erişmeyebilir.
  • Belge dosyaları eklenir veya değiştirilirse, bunlar Shell'in son belgeler listesine eklenebilir. Kullanıcı Başlat menüsünde belgeler komutuna tıkladığında, belgelerin bağlantılarının listesi görüntülenir.

Bu belgede, bu dosya yönetimi teknolojilerinin nasıl çalıştığı açıklanır. Daha sonra Kabuk'un dosyaları taşımak, kopyalamak, yeniden adlandırmak ve silmek için nasıl kullanılacağını ve Geri Dönüşüm Kutusu'ndaki nesnelerin nasıl yönetileceğini özetler.

Per-User Dosya Yönetimi

Windows 2000 Kabuğu, dosyaların belirli bir kullanıcıyla ilişkilendirilmesine izin verir, böylece dosyalar diğer kullanıcılardan gizlenir. Dosya sistemi açısından dosyalar, windows 2000 sistemlerinde genellikle C:\Documents and Settings\Username\ şeklinde kullanıcının profil klasörü altında depolanır. Bu özellik, birçok kişinin aynı bilgisayarı kullanmasına ve diğer kullanıcıların dosyalarının gizliliğini korumasına olanak tanır. Farklı kullanıcılar farklı programlara sahip olabilir. Ayrıca yöneticilerin ve uygulamaların başlatma (.ini) veya bağlantı (.lnk) dosyaları gibi öğeleri depolaması için basit bir yol sağlar. Böylece uygulamalar her kullanıcı için farklı bir durumu koruyabilir ve gerektiğinde bu durumu kolayca kurtarabilir. Ayrıca, tüm kullanıcılar için ortak olan bilgileri depolamak için bir profil klasörü de vardır.

Hangi kullanıcının oturum açtığını ve dosyalarının nerede bulunduğunu belirlemek uygun olmadığından, standart kullanıcı başına klasörler özel klasörlerdir ve CSIDLtarafından tanımlanır. Örneğin, kullanıcı başına Program Dosyaları klasörünün CSIDL'i CSIDL_PROGRAMS. Uygulamanız SHGetFolderLocation veya kullanıcı başına CSIDL'lerden biriyle SHGetFolderPathçağırırsa, işlev işaretçiyi bir öğe tanımlayıcı listesine (PIDL) veya şu anda oturum açmış olan kullanıcıya uygun yolu döndürür. Uygulamanızın profil klasörünün yolunu veya PIDL'sini alması gerekiyorsa, ilgili CSIDL CSIDL_PROFILE'dir.

Belgelerim ve Resimlerim Klasörleri

Masaüstünde bulunan standart simgelerden biri Belgelerim. Bu klasörü açtığınızda, geçerli kullanıcının belge dosyalarını içerir. Belgelerim'in masaüstü örneği, kullanıcının belgelerini fiziksel olarak depolamak için kullanılan dosya sistemi konumunun bir diğer adı olan ve ad alanı hiyerarşisindeki masaüstünün hemen altında yer alan bir sanal klasördür.

Belgelerim ve Resimlerim klasörlerinin amacı, kullanıcıların belge ve resim dosyalarına birden çok kullanıcısı olabilecek bir sistemde erişmesi için basit ve güvenli bir yol sağlamaktır. Her kullanıcıya kendi dosyaları için ayrı dosya sistemi klasörleri atanır. Örneğin, bir kullanıcının belgeler klasörünün dosya sistemindeki konumu genellikle C:\Documents and Settings\kullanıcı adı\Belgelerim şeklindedir. Kullanıcıların dosya sistemi klasörlerinin fiziksel konumu hakkında bilgi sahibi olmalarına gerek yoktur. Dosyalarına Belgelerim simgesi aracılığıyla erişmeleri yeterlidir.

Not

Belgelerim kullanıcının kendi dosyalarına erişmesine izin verir, ancak diğer kullanıcıların dosyalarına erişmez. Birden çok kişi aynı bilgisayarı kullanıyorsa, yönetici kullanıcıları dosya sisteminin gerçek dosyaların depolandığı bölümün dışına kilitleyebilir. Böylece kullanıcılar Belgelerim klasörü aracılığıyla kendi belgeleri üzerinde çalışabilir, ancak diğer kullanıcılara ait belgeler üzerinde çalışamaz.

 

Bir uygulamanın, hangi kullanıcının oturum açtığını veya kullanıcının Belgelerim klasörünün dosya sisteminde nerede bulunduğunu bilmesine genellikle gerek yoktur. Bunun yerine uygulamanız, masaüstünün IShellFolder::P arseDisplayName yöntemini çağırarak Belgelerim masaüstü simgesinin PIDL'sini alabilir. Belgelerim klasörünü tanımlamak için kullanılan ayrıştırma adı bir dosya yolu değil, aksine ::{450d8fba-ad25-11d0-98a8-0800361b1103}. Köşeli ayraç içindeki ifade, Belgelerim klasörüne ait GUID'nin metin formudur. Örneğin, Belgelerim'in PIDL'sini almak için uygulamanız IShellFolder::P arseDisplayName için bu çağrıyı kullanmalıdır.

hr = psfDeskTop->ParseDisplayName(NULL, 
                                  NULL, 
                                  L"::{450d8fba-ad25-11d0-98a8-0800361b1103}", 
                                  &chEaten, 
                                  &pidlDocFiles, 
                                  NULL);

Uygulamanız Belgelerim PIDL'sini aldıktan sonra, klasörü normal bir dosya sistemi klasörü gibi işleyebilir; öğeleri numaralandırır, ayrıştırabilir, bağlar ve diğer geçerli klasör işlemlerini gerçekleştirir. Kabuk, Belgelerim veya alt klasörlerindeki değişiklikleri otomatik olarak uygun dosya sistemi klasörleriyle eşler.

Uygulamanızın, geçerli kullanıcının belgelerini içeren gerçek dosya sistemi klasörüne erişmesi gerekiyorsa, CSIDL_PERSONAL'ı SHGetFolderLocationfonksiyonuna iletin. İşlev, geçerli kullanıcının Belgelerim klasöründe görüntülenen dosya sistemi klasörünün PIDL'sini döndürür.

Bağlı Dosyalar

HTML belgelerinde genellikle bir dizi ilişkili grafik dosyası, stil sayfası dosyası, çeşitli Microsoft JScript (ECMA 262 dil belirtimi ile uyumlu) dosyaları vb. bulunur. Birincil HTML belgesini taşıdığınızda veya kopyaladığınızda, kopan bağlantılardan kaçınmak için genellikle ilişkili dosyalarını taşımak veya kopyalamak istersiniz. Ne yazık ki, şu ana kadar hangi dosyaların içeriklerini analiz etmek dışında herhangi bir HTML belgesiyle ilişkili olduğunu saptamanın kolay bir yolu yoktu. Bu sorunu gidermek için Windows 2000, birincil HTML belgesi ilişkili dosya grubuna bağlanmak basit bir yol sağlar. Dosya bağlantısı etkinse, belge taşındığında veya kopyalandığında tüm bağlı dosyaları da bu dosyayla birlikte gider.

Bağlı dosya grubu oluşturmak için, birincil belgenin bir .htm veya .html dosya adı uzantısı olmalıdır. Birincil belgenin üst klasörünün alt klasörünü oluşturun. Alt klasörün adı, birincil belgenin adı olmalı, .htm veya .html uzantısı çıkarılmalı ve ardından aşağıda listelenen uzantılardan biri eklenmelidir. En yaygın kullanılan uzantılar ".files" veya "_files"dir. Örneğin, birincil belge MyDoc.htmolarak adlandırılırsa, alt klasörü "MyDoc_files" olarak adlandırmak, alt klasörü belgenin bağlı dosyalarının kapsayıcısı olarak tanımlar. Birincil belge taşınır veya kopyalanırsa, alt klasör ve dosyaları da taşınır veya kopyalanır.

Bazı dillerde, bağlı dosyalar için bir alt klasör oluşturmak üzere "_files" yerelleştirilmiş eşdeğerini kullanmak mümkündür. Aşağıdaki tabloda, bağlı dosyalar alt klasörü oluşturmak için belge adına eklenebilen geçerli dizeler listelenmiştir. Şunu unutmayın: Bu dizelerden bazılarının ilk karakteri '_' veya '.' yerine '-' olabilir.

"_archivos"

"_dosyalar"

"_bestanden"

"_bylos"

"-Dosyalar"

"_datoteke"

"_dosyalar"

"_elemei"

"_failid"

_başarısız olur

"_fajlovi"

_dosyalar

_dosyalar

"-filer"

.files

"_files"

"_file"

"_fitxers"

"_dosyalar"

"_pliki"

"_dosyalar"

_dosyalar

 

Not

Bu özellik, uzantının durumuna duyarlıdır. Örneğin, yukarıda verilen örnekte , "MyDoc_Files" adlı bir alt klasör MyDoc.htm'a bağlanmaz.

 

Dosya bağlantısının etkinleştirilip etkinleştirilmediği veya devre dışı bırakılıp bırakılmadığı, aşağıdaki kayıt defteri anahtarının REG_DWORD değeri noFileFolderConnection tarafından denetlenir.

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer

Bu değer normalde tanımlanmaz ve dosya bağlantısı etkinleştirilir. Gerekirse, anahtara bu değeri ekleyerek ve 1 olarak ayarlayarak dosya bağlantısını devre dışı bırakabilirsiniz. Dosya bağlantısını yeniden etkinleştirmek için NoFileFolderConnection değerini sıfır olarak ayarlayın.

Not

Diğer uygulamalar buna bağlı olabileceği için dosya bağlantısı normalde etkinleştirilmelidir. Dosya bağlantısını yalnızca kesinlikle gerekliyse devre dışı bırakın.

 

Dosyaları Taşıma, Kopyalama, Yeniden Adlandırma ve Silme

Ad alanı statik değildir ve uygulamaların genellikle aşağıdaki işlemlerden birini gerçekleştirerek dosya sistemini yönetmesi gerekir.

  • Nesneyi başka bir klasöre kopyalama.
  • Nesneyi başka bir klasöre taşıma.
  • Bir nesneyi silme.
  • Nesneyi yeniden adlandırma.

Bu işlemlerin tümü SHFileOperationile gerçekleştirilir. Bu işlev bir veya daha fazla kaynak dosya alır ve karşılık gelen hedef dosyaları üretir. Silme işlemi söz konusu olduğunda, sistem silinen dosyaları Geri Dönüşüm Kutusu'na yerleştirmeye çalışır.

Dosyaları sürükleyip bırakma işlevselliğini kullanarak taşımak da mümkündür.

İşlevi kullanmak için, bir SHFILEOPSTRUCT yapısının üyelerini doldurmanız ve bunu SHFileOperationfonksiyonuna geçirmeniz gerekir. Yapının temel üyeleri pFrom ve pTo.

pFrom üyesi, bir veya daha fazla kaynak dosya adı içeren çift nullsonlandırılan dizedir. Bu adlar, tam nitelikli yollar veya *.* gibi DOS'un standart joker karakterleri olabilir. Bu üye, nullile sonlanan bir dize olarak tanımlanmasına rağmen, birden fazla dosya adını depolamak için bir arabellek olarak kullanılır. Her dosya adı, normal tek NULL karakteriyle sonlandırılmalıdır. pFromsonunu belirtmek için son adın sonuna ek bir NULL karakteri eklenmelidir.

pTo üyesi, pFromgibi çift nullsonlandırılan dizedir. pTo üyesi bir veya daha fazla tam nitelikli hedef adını içerir. pFromile aynı şekilde pTo içine paketlenirler. pTo birden çok ad içeriyorsa, fFlags üyesinde de FOF_MULTIDESTFILES bayrağını ayarlamanız gerekir. pTo kullanımı, burada açıklandığı gibi işleme bağlıdır.

  • Kopyalama ve taşıma işlemleri için, tüm dosyalar tek bir dizine gidiyorsa, pTo tam dizin adını içerir. Dosyalar farklı hedeflere gidiyorsa, pTo her kaynak dosya için bir tam nitelikli dizin veya dosya adı da içerebilir. Bir dizin yoksa, sistem bunu oluşturur.
  • Yeniden adlandırma işlemleri için pTo, pFromiçindeki her kaynak dosya için bir tam yol içerir.
  • Silme işlemleri için pTo kullanılmaz.

Shell'e bildirme

Dosyaları taşımak, kopyalamak, yeniden adlandırmak veya silmek için SHFileOperation kullandıktan sonra veya ad alanını etkileyen başka bir eylemde bulunduktan sonra Shell'e değişikliği bildirin. Bildirimle birlikte yapılması gereken eylemler şunlardır:

  • Dosya veya klasör ekleme veya silme.
  • Dosyaları veya klasörleri taşıma, kopyalama veya yeniden adlandırma.
  • Dosya ilişkilendirmesini değiştirme.
  • Dosya öznitelikleri değiştiriliyor.
  • Sürücüleri veya depolama medyasını ekleme veya kaldırma.
  • Paylaşılan klasör oluşturma veya devre dışı bırakma.
  • Sistem görüntüsü listesini değiştirme.

Bir uygulama, SHChangeNotify'ı çağırarak nelerin değiştiğini ayrıntılarıyla birlikte Shell'e bildirir. Shell daha sonra ad alanı görünümünü yeni durumunu doğru yansıtacak şekilde güncelleyebilir.

SHFileOperation ile Dosyaları Yönetmeye Yönelik Basit Örnek

Aşağıdaki örnek konsol uygulaması, dosyaları bir dizinden diğerine kopyalamak için SHFileOperation kullanımını gösterir. C:\My_Docs ve C:\My_Docs2 kaynak ve hedef dizinleri basitlik için uygulamaya sabit kodlanmıştır.

#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;
}

Uygulama önce masaüstünün IShellFolder arabirimine bir işaretçi alır. Ardından tam yolunu IShellFolder::P arseDisplayNamegeçirerek kaynak dizinin PIDL'sini alır. IShellFolder::ParseDisplayName dizinin yolunun bir Unicode dizesi olmasını gerektirdiğini unutmayın. Uygulama daha sonra kaynak dizine bağlanır ve IShellFolder arabirimini kullanarak bir numaralandırıcı nesnesinin IEnumIDList arabirimini alır.

Kaynak dizindeki her dosya numaralandırılırken, adını almak için IShellFolder::GetDisplayNameOfkullanılır. SHGDN_FORPARSING bayrağı ayarlanır ve bu da IShellFolder::GetDisplayNameOf dosyasının tam yolunu döndürmesine neden olur. Sonlandırıcı NULL karakterleri de dahil olmak üzere dosya yolları, tek bir dizide szSourceFilesolarak birleştirilir. Diziyi düzgün şekilde sonlandırmak için son yola ikinci bir NULL karakteri eklenir.

Numaralandırma tamamlandıktan sonra uygulama SHFILEOPSTRUCT yapısına değerler atar. Hedefi belirtmek için pTo'e atanan dizinin de bir çift NULLtarafından sonlandırılması gerektiğini unutmayın. Bu durumda, basitçe pTo'e atanan dizeye eklenir. Bu bir konsol uygulaması olduğundan, FOF_SILENT, FOF_NOCONFIRMATION ve FOF_NOCONFIRMMKDIR bayrakları, görünebilecek iletişim kutularını bastıracak şekilde ayarlanır. SHFileOperation döndürdüğünde, değişikliği Shell'e bildirmek için SHChangeNotify çağrılır. Ardından uygulama her zamanki temizleme işlemini gerçekleştirir ve döndürür.

Kabuğun Son Belgeler Listesine Dosya Ekleme

Kabuk, her kullanıcı için son eklenen veya değiştirilen belgelerin listesini tutar. Kullanıcı, Başlat menüsünde Belgeler'e tıklayarak bu dosyaların bağlantılarının listesini görüntüleyebilir. Belgelerim'de olduğu gibi, her kullanıcının gerçek bağlantıları tutmak için bir dosya sistemi dizini vardır. Geçerli kullanıcının En Son dizininin PIDL'sini almak için uygulamanız CSIDL_RECENT ile SHGetFolderLocation çağırabilir veya yolunu almak için SHGetFolderPath çağırabilir.

Uygulamanız, bu belgenin önceki bölümlerinde açıklanan teknikleri kullanarak En Son klasörünün içeriğini numaralandırabilir. Ancak, bir uygulama klasörün içeriğini normal bir dosya sistemi klasörüymiş gibi değiştirmemelidir. Böyle bir durumda Shell'in son kullanılan belgeler listesi düzgün güncelleştirilmeyecek ve değişiklikler Başlat menüsüne yansıtılmaz. Bunun yerine, kullanıcının En Son klasörüne belge bağlantısı eklemek için uygulamanız SHAddToRecentDocsçağırabilir. Kabuk, uygun dosya sistemi klasörüne bir bağlantı ekleyip son kullanılan belgeler listesini ve Başlat menüsünü güncelleştirir. Klasörü temizlemek için de bu işlevi kullanabilirsiniz.