Mendapatkan ID Folder

Sebelum Anda dapat menggunakan objek namespace, Anda memerlukan cara untuk mengidentifikasinya. Ini berarti mendapatkan penunjuknya ke daftar pengidentifikasi item (PIDL) atau, dalam kasus objek sistem file, jalurnya. Bagian ini membahas dua cara yang lebih sederhana untuk mendapatkan ID objek.

Untuk pendekatan yang lebih kuat yang akan bekerja dengan folder apa pun, gunakan antarmuka IShellFolder . Lihat Mendapatkan Informasi Tentang Konten Folder untuk detail selengkapnya.

Kotak dialog OpenFiles

Untuk memungkinkan pengguna menavigasi namespace layanan dan memilih folder, aplikasi Anda dapat menggunakan antarmuka IFileDialog . Memanggil antarmuka ini dengan bendera FOS_PICKFOLDERS meluncurkan kotak dialog umum Open Files dalam mode "pilih folder".

Untuk Windows Vista dan yang lebih baru, ini adalah cara yang disarankan untuk memilih folder.

Kotak dialog SHBrowseForFolder

Untuk memungkinkan pengguna menavigasi namespace layanan dan memilih folder, aplikasi Anda cukup memanggil SHBrowseForFolder. Memanggil fungsi ini meluncurkan kotak dialog dengan UI yang berfungsi agak seperti kotak dialog umum Buka atau SimpanPa .

Ketika pengguna memilih folder, SHBrowseForFolder mengembalikan PIDL folder yang sepenuhnya memenuhi syarat dan nama tampilannya. Jika folder berada dalam sistem file, aplikasi dapat mengonversi PIDL ke jalur dengan memanggil SHGetPathFromIDList. Aplikasi ini juga dapat membatasi rentang folder yang dapat dipilih pengguna dengan menentukan folder akar. Hanya folder yang berada di bawah akar tersebut di namespace layanan yang akan muncul. Ilustrasi berikut ini memperlihatkan kotak dialog SHBrowseForFolder , dengan folder akar diatur ke File Program.

cuplikan layar kotak dialog telusuri folder

Contoh sederhana tentang cara menggunakan SHBrowseForFolder disediakan nanti.

Folder Khusus dan CSIDL

Sejumlah folder yang umum digunakan ditetapkan sebagai khusus oleh sistem. Folder ini memiliki tujuan yang terdefinisi dengan baik, dan sebagian besar ada di semua sistem. Bahkan jika mereka tidak ada pada awalnya, nama dan lokasi mereka masih ditentukan, sehingga dapat ditambahkan nanti. Kumpulan folder khusus mencakup semua folder virtual standar sistem, seperti Printer, Dokumen Saya, dan Lingkungan Jaringan. Ini juga mencakup sejumlah folder sistem file standar, seperti File Program dan Sistem.

Meskipun folder adalah komponen standar dari semua sistem, nama dan lokasinya di namespace layanan dapat bervariasi. Misalnya, direktori Sistem adalah C:\Winnt\System32 pada beberapa sistem dan C:\Windows\System32 pada sistem lain. Di masa lalu, variabel lingkungan menyediakan cara untuk menentukan nama dan lokasi folder khusus pada sistem tertentu. Shell sekarang menyediakan cara yang lebih kuat dan fleksibel untuk mengidentifikasi folder khusus, CSIDL. Anda umumnya harus menggunakannya alih-alih variabel lingkungan.

CSIDL menyediakan cara yang seragam untuk mengidentifikasi dan menemukan folder khusus, terlepas dari nama atau lokasinya pada sistem tertentu. Tidak seperti variabel lingkungan, CSIDL dapat digunakan dengan folder virtual serta folder sistem file. Setiap folder khusus memiliki CSIDL unik yang ditetapkan untuk itu. Misalnya, folder sistem file Program Files memiliki CSIDL CSIDL_PROGRAM_FILES, dan folder virtual Network Neighborhood memiliki CSIDL CSIDL_NETWORK.

CSIDL digunakan bersama dengan salah satu dari beberapa fungsi Shell untuk mengambil PIDL folder khusus, atau jalur folder sistem file khusus. Jika folder tidak ada pada sistem, aplikasi Anda dapat memaksanya untuk dibuat dengan menggabungkan CSIDL-nya dengan CSIDL_FLAG_CREATE. CSIDL dapat diteruskan ke fungsi berikut:

Perhatikan bahwa kedua fungsi ini diperkenalkan dengan shell versi 5.0 dan menggantikan fungsi SHGetSpecialFolderLocation dan SHGetSpecialFolderPath .

Contoh Sederhana Tentang Cara Menggunakan CSIDL dan SHBrowseForFolder

Contoh fungsi berikut, PidlBrowse, menggambarkan cara menggunakan CSIDL untuk mengambil PIDL folder, dan menggunakan SHBrowseForFolder agar pengguna memilih folder. Ini mengembalikan PIDL dan nama tampilan folder yang dipilih.

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

Aplikasi panggilan melewati handel jendela, yang diperlukan oleh SHBrowseForFolder. Parameter nCSIDL adalah CSIDL opsional yang digunakan untuk menentukan folder akar. Hanya folder di bawah folder akar dalam hierarki yang akan ditampilkan. Ilustrasi yang ditampilkan sebelumnya dihasilkan dengan memanggil fungsi ini dengan nCSIDL diatur ke CSIDL_PROGRAM_FILES. Aplikasi panggilan juga melewati buffer string, pszDisplayName, untuk menahan nama tampilan folder yang dipilih saat PidlBrowse kembali. Adalah tanggung jawab aplikasi panggilan untuk membebaskan IDList yang dikembalikan oleh SHBrowseForFolder menggunakan CoTaskMemFree.