Aracılığıyla paylaş


Klasör Kimliğini Alma

Bir ad alanı nesnesini kullanabilmeniz için önce bunu tanımlamak için bir yol gerekir. Bu, bir öğe tanımlayıcı listesine (PIDL) bir işaretçinin veya dosya sistemi nesneleri söz konusu olduğunda yolunu elde etmek anlamına gelir. Bu bölümde nesne kimliklerini edinmenin iki basit yolu açıklanmıştır.

Herhangi bir klasörle çalışacak daha güçlü bir yaklaşım için IShellFolder arabirimini kullanın. Daha fazla bilgi için bkz. Klasör İçeriği Hakkında Bilgi Alma.

OpenFiles İletişim Kutusu

Kullanıcının ad alanında gezinmesini ve bir klasör seçmesini sağlamak için uygulamanız IFileDialog arabirimini kullanabilir. Bu arabirimin FOS_PICKFOLDERS bayrağıyla çağrılması, "klasörleri seç" modunda Dosyaları Aç ortak iletişim kutusunu başlatır.

Windows Vista ve sonraki sürümlerde, klasörleri seçmek için önerilen yöntem budur.

SHBrowseForFolder İletişim Kutusu

Kullanıcının ad alanında gezinmesini ve bir klasör seçmesini sağlamak için uygulamanız SHBrowseForFolderçağırabilir. Bu işlevin çağrılması, Aç veya Kaydet ortak iletişim kutuları gibi çalışan bir kullanıcı arabirimine sahip bir iletişim kutusu başlatır.

Kullanıcı bir klasör seçtiğinde SHBrowseForFolder klasörün tam PIDL'sini ve görünen adını döndürür. Klasör dosya sistemindeyse, uygulama SHGetPathFromIDListçağırarak PIDL'i bir yola dönüştürebilir. Uygulama, kullanıcının bir kök klasör belirterek seçebileceği klasör aralığını da kısıtlayabilir. Yalnızca ad alanında bu kökün altındaki klasörler görüntülenir. Aşağıdaki çizimde, kök klasör Program Files olarak ayarlanmış SHBrowseForFolder iletişim kutusu gösterilmektedir.

Klasöre gözat iletişim kutusunun ekran görüntüsü

SHBrowseForFolder kullanmanın basit bir örneği daha sonra sağlanmıştır.

Özel Klasörler ve CSIDL'ler

Yaygın olarak kullanılan bir dizi klasör, sistem tarafından özel olarak atanır. Bu klasörlerin iyi tanımlanmış bir amacı vardır ve bunların çoğu tüm sistemlerde bulunur. Başlangıçta mevcut olmasalar bile adları ve konumları hala tanımlanır, bu nedenle daha sonra eklenebilirler. Özel klasörlerin koleksiyonu Yazıcılar, Belgelerim ve Ağ Mahallesi gibi sistemin tüm standart sanal klasörlerini içerir. Ayrıca Program Dosyaları ve Sistem gibi bir dizi standart dosya sistemi klasörü içerir.

Klasörler tüm sistemlerin standart bir bileşeni olsa da ad alanı içindeki adları ve konumları farklılık gösterebilir. Örneğin, Sistem dizini bazı sistemlerde C:\Winnt\System32, diğer sistemlerde ise C:\Windows\System32'dir. Geçmişte ortam değişkenleri belirli bir sistemdeki özel bir klasörün adını ve konumunu belirlemek için bir yol sağlardı. Kabuk, artık özel klasörleri tanımlamak için veCSIDL'lerle daha sağlam ve esnek bir yol sağlar. Bunları genellikle ortam değişkenleri yerine kullanmanız gerekir.

CSIDL'ler, belirli bir sistemdeki adlarından veya konumlarından bağımsız olarak özel klasörleri tanımlamanın ve bulmanın tekdüzen bir yolunu sağlar. Ortam değişkenlerinden farklı olarak, CSIDL'ler hem sanal klasörlerle hem de dosya sistemi klasörleriyle kullanılabilir. Her özel klasörün kendisine atanmış benzersiz bir CSIDL'i vardır. Örneğin, Program Files dosya sistemi klasörü CSIDL_PROGRAM_FILESCSIDL'sine ve Ağ Mahallesi sanal klasöründe CSIDL_NETWORKCSIDL'sine sahiptir.

CSIDL, özel bir klasörün PIDL'sini veya özel bir dosya sistemi klasörünün yolunu almak için çeşitli Kabuk işlevlerinden biriyle birlikte kullanılır. Klasör bir sistemde yoksa, uygulamanız CSIDL'sini CSIDL_FLAG_CREATEile birleştirerek oluşturulmasını zorlayabilir. CSIDL aşağıdaki işlevlere geçirilebilir:

  • özel bir klasörün PIDL'sini alan SHGetFolderLocation.
  • SHGetFolderPath, dosya sistemi özel klasörünün yolunu elde eden bir yöntemdir.

Bu iki işlevin Kabuğun 5.0 sürümüyle sunulduğunu ve SHGetSpecialFolderLocation ve SHGetSpecialFolderPath işlevlerinin yerini aldığına dikkat edin.

CSIDL'lerin ve SHBrowseForFolder'ın Kullanımına Basit Bir Örnek

Aşağıdaki örnek işlev PidlBrowse, csidls kullanarak bir klasörün PIDL'sini almayı ve kullanıcının klasör seçmesini sağlamak için SHBrowseForFolderkullanmayı gösterir. Seçilen klasörün PIDL'sini ve görünen adını döndürür.

LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
{
    LPITEMIDLIST pidlRoot = NULL;
    LPITEMIDLIST pidlSelected = NULL;
    BROWSEINFO bi = {0};

    if(nCSIDL)
    {
        SHGetFolderLocation(hwnd, nCSIDL, NULL, NULL, &pidlRoot);
    }

    else
    {
        pidlRoot = NULL;
    }

    bi.hwndOwner = hwnd;
    bi.pidlRoot = pidlRoot;
    bi.pszDisplayName = pszDisplayName;
    bi.lpszTitle = "Choose a folder";
    bi.ulFlags = 0;
    bi.lpfn = NULL;
    bi.lParam = 0;

    pidlSelected = SHBrowseForFolder(&bi);

    if(pidlRoot)
    {
        CoTaskMemFree(pidlRoot);
    }

    return pidlSelected;
}

Çağıran uygulama, SHBrowseForFoldertarafından gerekli olan bir pencere tanıtıcısını geçirir. nCSIDL parametresi, kök klasör belirtmek için kullanılan isteğe bağlı bir CSIDL'dir. Yalnızca hiyerarşideki kök klasörün altındaki klasörler görüntülenir. Önceden gösterilen çizim, nCSIDL parametresi CSIDL_PROGRAM_FILESolarak ayarlanarak bu işlevin çağrılmasıyla oluşturulmuştur. Çağıran uygulama ayrıca, PidlBrowse döndüğünde seçili klasörün görünen adını tutmak için bir dize arabelleği, pszDisplayName, geçirir. SHBrowseForFolder tarafından döndürülen IDList'in, CoTaskMemFreekullanılarak serbest bırakılması, çağıran uygulamanın sorumluluğundadır.