Mengelola Sistem File
Shell menyediakan sejumlah cara untuk mengelola sistem file. Shell menyediakan fungsi, SHFileOperation, yang memungkinkan aplikasi untuk memindahkan, menyalin, mengganti nama, dan menghapus file secara terprogram. Shell juga mendukung beberapa kemampuan manajemen file tambahan.
- Dokumen HTML dapat disambungkan ke file terkait, seperti file grafis atau lembar gaya. Ketika dokumen dipindahkan atau disalin, file yang tersambung juga secara otomatis dipindahkan atau disalin.
- Untuk sistem yang tersedia untuk lebih dari satu pengguna, file dapat dikelola berdasarkan per pengguna. Pengguna memiliki akses mudah ke file data mereka, tetapi tidak ke file milik pengguna lain.
- Jika file dokumen ditambahkan atau dimodifikasi, file tersebut dapat ditambahkan ke daftar dokumen terbaru Shell. Saat pengguna mengklik perintah Dokumen pada menu Mulai, daftar tautan ke dokumen akan muncul.
Dokumen ini membahas cara kerja teknologi manajemen file ini. Kemudian menguraikan cara menggunakan Shell untuk memindahkan, menyalin, mengganti nama, dan menghapus file, dan cara mengelola objek di Keranjang Sampah.
- Manajemen File Per Pengguna
- Dokumen Saya dan Folder Gambar Saya
- File Tersambung
- Memindahkan, Menyalin, Mengganti Nama, dan Menghapus File
- Contoh Sederhana Mengelola File dengan SHFileOperation
- Menambahkan File ke Daftar Dokumen Terbaru Shell
Windows 2000 Shell memungkinkan file dikaitkan dengan pengguna tertentu sehingga file tetap tersembunyi dari pengguna lain. Dalam hal sistem file, file disimpan di bawah folder profil pengguna, biasanya C:\Documents and Settings\Username\ pada sistem Windows 2000. Fitur ini memungkinkan banyak individu untuk menggunakan komputer yang sama, sambil menjaga privasi file mereka dari pengguna lain. Pengguna yang berbeda dapat memiliki program yang berbeda yang tersedia. Ini juga menyediakan cara mudah bagi administrator dan aplikasi untuk menyimpan hal-hal seperti inisialisasi (.ini) atau menautkan file (.lnk). Aplikasi dengan demikian dapat mempertahankan status yang berbeda untuk setiap pengguna dan dengan mudah memulihkan status tertentu saat diperlukan. Ada juga folder profil untuk menyimpan informasi yang umum bagi semua pengguna.
Karena tidak nyaman untuk menentukan pengguna mana yang masuk dan di mana file mereka berada, folder standar per pengguna adalah folder khusus dan diidentifikasi oleh CSIDL. Misalnya, CSIDL untuk folder Program Files per pengguna CSIDL_PROGRAMS. Jika aplikasi Anda memanggil SHGetFolderLocation atau SHGetFolderPath dengan salah satu CSIDL per pengguna, fungsi mengembalikan penunjuk ke daftar pengidentifikasi item (PIDL) atau jalur yang sesuai dengan pengguna yang saat ini masuk. Jika aplikasi Anda perlu mengambil jalur atau PIDL folder profil, CSIDL-nya CSIDL_PROFILE.
Salah satu ikon standar yang ditemukan di desktop adalah Dokumen Saya. Ketika Anda membuka folder ini, folder ini berisi file dokumen pengguna saat ini. Instans desktop Dokumen Saya adalah folder virtual—alias ke lokasi sistem file yang digunakan untuk menyimpan dokumen pengguna secara fisik—terletak tepat di bawah desktop di hierarki namespace.
Tujuan folder Dokumen Saya dan Gambar Saya adalah untuk menyediakan cara yang mudah dan aman bagi pengguna untuk mengakses file dokumen dan gambar mereka pada sistem yang mungkin memiliki beberapa pengguna. Setiap pengguna diberi folder sistem file terpisah untuk filenya. Misalnya, lokasi folder dokumen pengguna dalam sistem file biasanya sesuatu seperti C:\Documents and Settings\username\My Documents. Pengguna tidak perlu mengetahui apa pun tentang lokasi fisik folder sistem file mereka. Mereka cukup mengakses file mereka melalui ikon Dokumen Saya.
Catatan
Dokumen Saya memungkinkan pengguna untuk mengakses filenya sendiri tetapi bukan file pengguna lain. Jika beberapa individu menggunakan komputer yang sama, administrator dapat mengunci pengguna dari bagian sistem file tempat file aktual disimpan. Pengguna dengan demikian akan dapat mengerjakan dokumen mereka sendiri melalui folder Dokumen Saya tetapi tidak pada dokumen milik pengguna lain.
Biasanya tidak perlu aplikasi untuk mengetahui pengguna mana yang masuk atau di mana dalam sistem file folder Dokumen Saya pengguna berada. Sebagai gantinya, aplikasi Anda dapat mengambil PIDL ikon desktop Dokumen Saya dengan memanggil metode IShellFolder::P arseDisplayName desktop. Nama penguraian yang digunakan untuk mengidentifikasi folder Dokumen Saya bukan jalur file melainkan ::{450d8fba-ad25-11d0-98a8-0800361b1103}. Ekspresi kurung adalah bentuk teks GUID Dokumen Saya. Misalnya, untuk mengambil PIDL Dokumen Saya, aplikasi Anda harus menggunakan panggilan ini ke IShellFolder::P arseDisplayName.
hr = psfDeskTop->ParseDisplayName(NULL,
NULL,
L"::{450d8fba-ad25-11d0-98a8-0800361b1103}",
&chEaten,
&pidlDocFiles,
NULL);
Setelah aplikasi Anda memiliki PIDL Dokumen Saya, aplikasi dapat menangani folder seperti folder sistem file normal—menghitung item, menguraikan, mengikat, dan melakukan operasi folder lain yang valid. Shell secara otomatis memetakan perubahan di Dokumen Saya atau subfoldernya ke folder sistem file yang sesuai.
Jika aplikasi Anda memerlukan akses ke folder sistem file aktual yang berisi dokumen pengguna saat ini, teruskan CSIDL_PERSONAL ke SHGetFolderLocation. Fungsi mengembalikan PIDL folder sistem file yang ditampilkan di folder Dokumen Saya pengguna saat ini.
Dokumen HTML sering memiliki sejumlah file grafis terkait, file lembar gaya, beberapa file Microsoft JScript (kompatibel dengan spesifikasi bahasa ECMA 262), dan sebagainya. Saat Anda memindahkan atau menyalin dokumen HTML utama, Anda biasanya juga ingin memindahkan atau menyalin file terkait untuk menghindari tautan yang melanggar. Sayangnya, belum ada cara mudah hingga saat ini untuk menentukan file mana yang terkait dengan dokumen HTML tertentu selain dengan menganalisis kontennya. Untuk meringankan masalah ini, Windows 2000 menyediakan cara sederhana untuk menyambungkan dokumen HTML utama ke grup file terkait. Jika koneksi file diaktifkan, ketika dokumen dipindahkan atau disalin semua file yang tersambung sesuai dengannya.
Untuk membuat grup file yang tersambung, dokumen utama harus memiliki ekstensi nama file .htm atau .html. Buat subfolder folder induk dokumen utama. Nama subfolder harus berupa nama dokumen utama, dikurangi ekstensi .htm atau .html, diikuti oleh salah satu ekstensi yang tercantum di bawah ini. Ekstensi yang paling umum digunakan adalah ".files" atau "_files". Misalnya, jika dokumen utama diberi nama MyDoc.htm, penamaan subfolder "MyDoc_files" mendefinisikan subfolder sebagai kontainer untuk file yang terhubung dengan dokumen. Jika dokumen utama dipindahkan atau disalin, subfolder dan filenya juga dipindahkan atau disalin.
Untuk beberapa bahasa, dimungkinkan untuk menggunakan yang setara dengan "_files" yang dilokalkan untuk membuat subfolder untuk file yang terhubung. Tabel berikut mencantumkan string valid yang bisa ditambahkan ke nama dokumen untuk membuat subfolder file yang tersambung. Perhatikan bahwa beberapa string ini memiliki '-' sebagai karakter pertamanya daripada '_' atau '.'.
"_archivos"
"_arquivos"
"_bestanden"
"_bylos"
"-Dateien"
"_datoteke"
"_dosyalar"
"_elemei"
"_failid"
"_fails"
"_fajlovi"
"_ficheiros"
"_fichiers"
"-filer"
".files"
"_files"
"_file"
"_fitxers"
"_fitxategiak"
"_pliki"
"_soubory"
"_tiedostot"
Catatan
Fitur ini sensitif terhadap kasus ekstensi. Misalnya, misalnya yang diberikan di atas, subfolder bernama "MyDoc_Files" tidak akan terhubung ke MyDoc.htm.
Apakah koneksi file diaktifkan atau dinonaktifkan dikontrol oleh nilai REG_DWORD , NoFileFolderConnection, dari kunci registri berikut.
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Explorer
Nilai ini biasanya tidak ditentukan, dan koneksi file diaktifkan. Jika perlu, Anda dapat menonaktifkan koneksi file dengan menambahkan nilai ini ke kunci dan mengaturnya ke 1. Untuk mengaktifkan koneksi file lagi, atur NoFileFolderConnection ke nol.
Catatan
Koneksi file biasanya harus diaktifkan karena aplikasi lain mungkin bergantung padanya. Nonaktifkan koneksi file hanya jika benar-benar diperlukan.
Namespace tidak statis, dan aplikasi biasanya perlu mengelola sistem file dengan melakukan salah satu operasi berikut.
- Menyalin objek ke folder lain.
- Memindahkan objek ke folder lain.
- Menghapus objek.
- Mengganti nama objek.
Semua operasi ini dilakukan dengan SHFileOperation. Fungsi ini mengambil satu atau beberapa file sumber dan menghasilkan file tujuan yang sesuai. Dalam kasus operasi penghapusan, sistem mencoba memasukkan file yang dihapus ke dalam Keranjang Sampah.
Dimungkinkan juga untuk memindahkan file menggunakan fungsionalitas seret dan letakkan .
Untuk menggunakan fungsi ini, Anda harus mengisi anggota struktur SHFILEOPSTRUCT dan meneruskannya ke SHFileOperation. Anggota kunci struktur adalah pFrom dan pTo.
Anggota pFrom adalah string ganda yang dihentikan null yang berisi satu atau beberapa nama file sumber. Nama-nama ini dapat berupa jalur yang sepenuhnya memenuhi syarat atau wildcard DOS standar seperti *.*. Meskipun anggota ini dinyatakan sebagai string yang dihentikan null, ini digunakan sebagai buffer untuk menyimpan beberapa nama file. Setiap nama file harus dihentikan oleh karakter NULL tunggal yang biasa. Karakter NULL tambahan harus ditambahkan ke akhir nama akhir untuk menunjukkan akhir pFrom.
Anggota pTo adalah string ganda yang dihentikan null, seperti pFrom. Anggota pTo berisi nama satu atau beberapa nama tujuan yang sepenuhnya memenuhi syarat. Mereka dikemas ke dalam pTo dengan cara yang sama seperti untuk pFrom. Jika pTo berisi beberapa nama, Anda juga harus mengatur bendera FOF_MULTIDESTFILES di anggota fFlags . Penggunaan pTo tergantung pada operasi seperti yang dijelaskan di sini.
- Untuk operasi salin dan pindahkan, jika semua file masuk ke satu direktori, pTo berisi nama direktori yang sepenuhnya memenuhi syarat. Jika file pergi ke tujuan yang berbeda, pTo juga dapat berisi satu direktori atau nama file yang sepenuhnya memenuhi syarat untuk setiap file sumber. Jika direktori tidak ada, sistem akan membuatnya.
- Untuk operasi penggantian nama, pTo berisi satu jalur yang sepenuhnya memenuhi syarat untuk setiap file sumber dalam pFrom.
- Untuk operasi penghapusan, pTo tidak digunakan.
Beri tahu Shell tentang perubahan setelah menggunakan SHFileOperation untuk memindahkan, menyalin, mengganti nama, atau menghapus file, atau setelah mengambil tindakan lain yang memengaruhi namespace layanan. Tindakan yang harus disertai dengan pemberitahuan meliputi hal-hal berikut:
- Menambahkan atau menghapus file atau folder.
- Memindahkan, menyalin, atau mengganti nama file atau folder.
- Mengubah asosiasi file.
- Mengubah atribut file.
- Menambahkan atau menghapus drive atau media penyimpanan.
- Membuat atau menonaktifkan folder bersama.
- Mengubah daftar gambar sistem.
Aplikasi memberi tahu Shell dengan memanggil SHChangeNotify dengan detail apa yang telah berubah. Shell kemudian dapat memperbarui gambar namespace untuk secara akurat mencerminkan status barunya.
Contoh aplikasi konsol berikut mengilustrasikan penggunaan SHFileOperation untuk menyalin file dari satu direktori ke direktori lainnya. Direktori sumber dan tujuan, C:\My_Docs dan C:\My_Docs2, dikodekan secara permanen ke dalam aplikasi untuk kesederhanaan.
#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;
}
Aplikasi pertama-tama mengambil pointer ke antarmuka IShellFolder desktop. Kemudian mengambil PIDL direktori sumber dengan melewati jalur yang sepenuhnya memenuhi syarat ke IShellFolder::P arseDisplayName. Perhatikan bahwa IShellFolder::P arseDisplayName mengharuskan jalur direktori menjadi string Unicode. Aplikasi kemudian mengikat ke direktori sumber dan menggunakan antarmuka IShellFolder-nya untuk mengambil antarmuka IEnumIDList objek enumerator.
Karena setiap file dalam direktori sumber dijumlahkan, IShellFolder::GetDisplayNameOf digunakan untuk mengambil namanya. Bendera SHGDN_FORPARSING diatur, yang menyebabkan IShellFolder::GetDisplayNameOf mengembalikan jalur file yang sepenuhnya memenuhi syarat. Jalur file, termasuk karakter NULL yang mengakhiri, digabungkan menjadi satu array, szSourceFiles. Karakter NULL kedua ditambahkan ke jalur akhir untuk mengakhiri array dengan benar.
Setelah enumerasi selesai, aplikasi menetapkan nilai ke struktur SHFILEOPSTRUCT . Perhatikan bahwa array yang ditetapkan ke pTo untuk menentukan tujuan juga harus dihentikan oleh NULL ganda. Dalam hal ini, hanya disertakan dalam string yang ditetapkan ke pTo. Karena ini adalah aplikasi konsol, bendera FOF_SILENT, FOF_NOCONFIRMATION, dan FOF_NOCONFIRMMKDIR diatur untuk menekan kotak dialog apa pun yang mungkin muncul. Setelah SHFileOperation kembali, SHChangeNotify dipanggil untuk memberi tahu Shell tentang perubahan. Kemudian aplikasi melakukan pembersihan dan pengembalian yang biasa.
Shell mempertahankan daftar dokumen yang baru ditambahkan atau dimodifikasi untuk setiap pengguna. Pengguna dapat menampilkan daftar tautan ke file-file ini dengan mengklik Dokumen pada menu Mulai. Seperti halnya Dokumen Saya, setiap pengguna memiliki direktori sistem file untuk menyimpan tautan aktual. Untuk mengambil PIDL direktori Terbaru pengguna saat ini, aplikasi Anda dapat memanggil SHGetFolderLocation dengan CSIDL_RECENT, atau memanggil SHGetFolderPath untuk mengambil jalurnya.
Aplikasi Anda dapat menghitung konten folder Terbaru menggunakan teknik yang dibahas sebelumnya dalam dokumen ini. Namun, aplikasi tidak boleh memodifikasi konten folder seolah-olah itu adalah folder sistem file normal. Jika demikian, daftar dokumen terbaru Shell tidak akan diperbarui dengan benar, dan perubahan tidak akan tercermin di menu Mulai. Sebagai gantinya, untuk menambahkan tautan dokumen ke folder Terbaru pengguna, aplikasi Anda dapat memanggil SHAddToRecentDocs. Shell akan menambahkan tautan ke folder sistem file yang sesuai, serta memperbarui daftar dokumen terbaru dan menu Mulai. Anda juga dapat menggunakan fungsi ini untuk menghapus folder.