Menamai File, Jalur, dan Namespace

Semua sistem file yang didukung oleh Windows menggunakan konsep file dan direktori untuk mengakses data yang disimpan pada disk atau perangkat. Pengembang Windows yang bekerja dengan API Windows untuk I/O file dan perangkat harus memahami berbagai aturan, konvensi, dan batasan nama untuk file dan direktori.

Data dapat diakses dari disk, perangkat, dan berbagi jaringan menggunakan API I/O file. File dan direktori, bersama dengan namespace, adalah bagian dari konsep jalur, yang merupakan representasi string tempat untuk mendapatkan data terlepas dari disk atau perangkat atau koneksi jaringan untuk operasi tertentu.

Beberapa sistem file, seperti NTFS, mendukung file dan direktori tertaut, yang juga mengikuti konvensi penamaan file dan aturan seperti file atau direktori biasa. Untuk informasi tambahan, lihat Hard Links dan Junctions dan Reparse Points and File Operations.

Untuk mempelajari tentang mengonfigurasi Windows untuk mendukung jalur file panjang, lihat Batasan Panjang Jalur Maksimum.

Nama File dan Direktori

Semua sistem file mengikuti konvensi penamaan umum yang sama untuk file individual: nama file dasar dan ekstensi opsional, dipisahkan oleh titik. Namun, setiap sistem file, seperti NTFS, CDFS, exFAT, UDFS, FAT, dan FAT32, dapat memiliki aturan khusus dan berbeda tentang pembentukan komponen individu di jalur ke direktori atau file. Perhatikan bahwa direktori hanyalah file dengan atribut khusus yang menunjuknya sebagai direktori, tetapi sebaliknya harus mengikuti semua aturan penamaan yang sama dengan file biasa. Karena istilah direktori hanya mengacu pada jenis file khusus sejauh menyangkut sistem file, beberapa materi referensi akan menggunakan file istilah umum untuk mencakup konsep direktori dan file data seperti itu. Karena itu, kecuali ditentukan lain, aturan penamaan atau penggunaan atau contoh untuk file juga harus berlaku untuk direktori. Jalur istilah mengacu pada satu atau beberapa direktori, garis miring terbelakang, dan mungkin nama volume. Untuk informasi selengkapnya, lihat bagian Jalur .

Batasan jumlah karakter juga dapat berbeda dan dapat bervariasi tergantung pada sistem file dan format awalan nama jalur yang digunakan. Ini lebih rumit oleh dukungan untuk mekanisme kompatibilitas mundur. Misalnya, sistem file MS-DOS FAT yang lebih lama mendukung maksimum 8 karakter untuk nama file dasar dan 3 karakter untuk ekstensi, dengan total 12 karakter termasuk pemisah titik. Ini umumnya dikenal sebagai nama file 8.3. Sistem file Windows FAT dan NTFS tidak terbatas pada nama file 8.3, karena memiliki dukungan nama file yang panjang, tetapi masih mendukung nama file panjang versi 8.3.

Konvensi Penamaan

Aturan mendasar berikut memungkinkan aplikasi untuk membuat dan memproses nama yang valid untuk file dan direktori, terlepas dari sistem file:

  • Gunakan titik untuk memisahkan nama file dasar dari ekstensi dalam nama direktori atau file.

  • Gunakan garis miring terbelakang (\) untuk memisahkan komponen jalur. Garis miring terbalik membagi nama file dari jalur ke sana, dan satu nama direktori dari nama direktori lain dalam jalur. Anda tidak dapat menggunakan garis miring terbelakang dalam nama untuk file atau direktori aktual karena ini adalah karakter cadangan yang memisahkan nama menjadi komponen.

  • Gunakan garis miring terbalik sebagaimana diperlukan sebagai bagian dari nama volume, misalnya, "C:\" di "C:\path\file" atau "\server\share" di "\server\share\path\file" untuk nama Universal Naming Convention (UNC). Untuk informasi selengkapnya tentang nama UNC, lihat bagian Batasan Panjang Jalur Maksimum.

  • Jangan asumsikan sensitivitas kasus. Misalnya, pertimbangkan nama OSCAR, Oscar, dan oscar agar sama, meskipun beberapa sistem file (seperti sistem file yang mematuhi POSIX) dapat menganggapnya berbeda. Perhatikan bahwa NTFS mendukung semantik POSIX untuk sensitivitas kasus tetapi ini bukan perilaku default. Untuk informasi selengkapnya, lihat CreateFile.

  • Pendesain volume (huruf kandar) juga tidak peka huruf besar/kecil. Misalnya, "D:\" dan "d:\" merujuk ke volume yang sama.

  • Gunakan karakter apa pun di halaman kode saat ini untuk nama, termasuk karakter dan karakter Unicode dalam set karakter yang diperluas (128–255), kecuali untuk yang berikut ini:

    • Karakter yang dipesan berikut:

      • < (lebih kecil)
      • > (lebih besar)
      • : (titik dua)
      • " (kutipan ganda)
      • / (garis miring)
      • \ (garis miring terbelakang)
      • | (bilah vertikal atau pipa)
      • ? (Tanda tanya)
      • * (tanda bintang)
    • Nilai bilangan bulat nol, terkadang disebut sebagai karakter ASCII NUL .

    • Karakter yang representasi bilangan bulatnya berkisar antara 1 hingga 31, kecuali untuk aliran data alternatif tempat karakter ini diizinkan. Untuk informasi selengkapnya tentang aliran file, lihat File Aliran.

    • Karakter lain yang tidak diizinkan oleh sistem file target.

  • Gunakan titik sebagai komponen direktori dalam jalur untuk mewakili direktori saat ini, misalnya ".\temp.txt". Untuk informasi selengkapnya, lihat Jalur.

  • Gunakan dua periode berturut-turut (..) sebagai komponen direktori dalam jalur untuk mewakili induk direktori saat ini, misalnya ".. . \temp.txt". Untuk informasi selengkapnya, lihat Jalur.

  • Jangan gunakan nama yang dicadangkan berikut untuk nama file:

    CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM³, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT², dan LPT³. Hindari juga nama-nama ini diikuti segera oleh ekstensi; misalnya, NUL.txt dan NUL.tar.gz keduanya setara dengan NUL. Untuk informasi selengkapnya, lihat Namespace layanan.

    Catatan

    Windows mengenali digit superskrip 8-bit ISO/IEC 8859-1 ¹, ², dan ³ sebagai digit dan memperlakukannya sebagai bagian yang valid dari nama perangkat COM# dan LPT#, membuatnya dicadangkan di setiap direktori. Misalnya, echo test > COM¹ gagal membuat file.

  • Jangan akhiri nama file atau direktori dengan spasi atau titik. Meskipun sistem file yang mendasar dapat mendukung nama tersebut, shell Windows dan antarmuka pengguna tidak. Namun, dapat diterima untuk menentukan titik sebagai karakter pertama dari nama. Misalnya, ".temp".

Nama Pendek vs. Panjang

Nama file panjang dianggap sebagai nama file apa pun yang melebihi konvensi penamaan gaya MS-DOS pendek (juga disebut 8.3). Ketika Anda membuat nama file panjang, Windows juga dapat membuat bentuk pendek 8,3 nama, yang disebut alias 8.3 atau nama pendek, dan menyimpannya di disk juga. Alias 8.3 ini dapat dinonaktifkan karena alasan performa baik di seluruh sistem atau untuk volume tertentu, tergantung pada sistem file tertentu.

Alias Windows Server 2008, Windows Vista, Windows Server 2003 dan Windows XP: 8.3 tidak dapat dinonaktifkan untuk volume tertentu hingga Windows 7 dan Windows Server 2008 R2.

Pada banyak sistem file, nama file akan berisi tilde (~) dalam setiap komponen nama yang terlalu panjang untuk mematuhi aturan penamaan 8.3.

Catatan

Tidak semua sistem file mengikuti konvensi substitusi tilde, dan sistem dapat dikonfigurasi untuk menonaktifkan pembuatan alias 8.3 meskipun biasanya mendukungnya. Oleh karena itu, jangan membuat asumsi bahwa alias 8.3 sudah ada di disk.

Untuk meminta nama file 8.3, nama file panjang, atau jalur lengkap file dari sistem, pertimbangkan opsi berikut:

Pada sistem file yang lebih baru, seperti NTFS, exFAT, UDFS, dan FAT32, Windows menyimpan nama file panjang pada disk di Unicode, yang berarti bahwa nama file panjang asli selalu dipertahankan. Ini berlaku bahkan jika nama file panjang berisi karakter yang diperluas, terlepas dari halaman kode yang aktif selama operasi baca atau tulis disk.

File yang menggunakan nama file panjang dapat disalin antara partisi sistem file NTFS dan partisi sistem file Windows FAT tanpa kehilangan informasi nama file apa pun. Ini mungkin tidak berlaku untuk MS-DOS FAT yang lebih lama dan beberapa jenis sistem file CDFS (CD-ROM), tergantung pada nama file yang sebenarnya. Dalam hal ini, nama file pendek diganti jika memungkinkan.

Jalur

Jalur ke file tertentu terdiri dari satu atau beberapa komponen, dipisahkan oleh karakter khusus (garis miring terbalik), dengan setiap komponen biasanya menjadi nama direktori atau nama file, tetapi dengan beberapa pengecualian penting yang dibahas di bawah ini. Seringkali sangat penting untuk interpretasi sistem dari jalur seperti apa awalan, atau awalan, dari jalur tersebut. Awalan ini menentukan namespace jalur yang digunakan, dan selain itu karakter khusus apa yang digunakan di posisi mana dalam jalur, termasuk karakter terakhir.

Jika komponen jalur adalah nama file, itu harus menjadi komponen terakhir.

Setiap komponen jalur juga akan dibatasi oleh panjang maksimum yang ditentukan untuk sistem file tertentu. Secara umum, aturan ini termasuk dalam dua kategori: pendek dan panjang. Perhatikan bahwa nama direktori disimpan oleh sistem file sebagai jenis file khusus, tetapi aturan penamaan untuk file juga berlaku untuk nama direktori. Untuk meringkas, jalur hanyalah representasi string hierarki antara semua direktori yang ada untuk nama file atau direktori tertentu.

Jalur yang Sepenuhnya Memenuhi Syarat vs. Relatif

Untuk fungsi Windows API yang memanipulasi file, nama file sering kali relatif terhadap direktori saat ini, sementara beberapa API memerlukan jalur yang sepenuhnya memenuhi syarat. Nama file relatif terhadap direktori saat ini jika tidak dimulai dengan salah satu hal berikut:

  • Nama UNC dari format apa pun, yang selalu dimulai dengan dua karakter garis miring terbelakang ("\\"). Untuk informasi lebih lanjut, lihat bagian berikutnya.
  • Pendesain disk dengan garis miring terbelakang, misalnya "C:\" atau "d:\".
  • Garis miring terbelakang tunggal, misalnya, "\directory" atau "\file.txt". Ini juga disebut sebagai jalur absolut.

Jika nama file dimulai hanya dengan penanda disk tetapi bukan garis miring terbalik setelah titik dua, nama tersebut ditafsirkan sebagai jalur relatif ke direktori saat ini pada drive dengan huruf yang ditentukan. Perhatikan bahwa direktori saat ini mungkin atau mungkin bukan direktori akar tergantung pada apa yang diatur ke selama operasi "ubah direktori" terbaru pada disk tersebut. Contoh format ini adalah sebagai berikut:

  • "C:tmp.txt" mengacu pada file bernama "tmp.txt" di direktori saat ini pada drive C.
  • "C:tempdir\tmp.txt" mengacu pada file dalam subdirektori ke direktori saat ini pada drive C.

Jalur juga dikatakan relatif jika berisi "titik ganda"; yaitu, dua periode bersama-sama dalam satu komponen jalur. Penentu khusus ini digunakan untuk menunjukkan direktori di atas direktori saat ini, atau dikenal sebagai "direktori induk". Contoh format ini adalah sebagai berikut:

  • ".. \tmp.txt" menentukan file bernama tmp.txt yang terletak di induk direktori saat ini.
  • ".. \.. \tmp.txt" menentukan file yang merupakan dua direktori di atas direktori saat ini.
  • ".. \tempdir\tmp.txt" menentukan file bernama tmp.txt yang terletak di direktori bernama tempdir yang merupakan direktori peer ke direktori saat ini.

Jalur relatif dapat menggabungkan kedua jenis contoh, misalnya "C:.. \tmp.txt". Ini berguna karena, meskipun sistem melacak drive saat ini bersama dengan direktori drive saat ini, itu juga melacak direktori saat ini di setiap huruf drive yang berbeda (jika sistem Anda memiliki lebih dari satu), terlepas dari pendesain drive mana yang ditetapkan sebagai drive saat ini.

Batasan Panjang Jalur Maksimum

Dalam edisi Windows sebelum Windows 10 versi 1607, panjang maksimum untuk jalur adalah MAX_PATH, yang didefinisikan sebagai 260 karakter. Di versi Windows yang lebih baru, mengubah kunci registri atau menggunakan alat Kebijakan Grup diperlukan untuk menghapus batas. Lihat Batasan Panjang Jalur Maksimum untuk detail selengkapnya.

Namaspace

Ada dua kategori utama konvensi namespace layanan yang digunakan dalam API Windows, umumnya disebut sebagai namespace layanan NT dan namespace Win32. Namespace layanan NT dirancang untuk menjadi namespace tingkat terendah di mana subsistem dan namespace layanan lain bisa ada, termasuk subsistem Win32 dan, dengan ekstensi, namespace Win32. POSIX adalah contoh lain dari subsistem di Windows yang dibangun di atas namespace layanan NT. Versi awal Windows juga mendefinisikan beberapa nama yang telah ditentukan sebelumnya, atau dicadangkan, untuk perangkat khusus tertentu seperti port komunikasi (serial dan paralel) dan konsol tampilan default sebagai bagian dari apa yang sekarang disebut namespace perangkat NT, dan masih didukung dalam versi Windows saat ini untuk kompatibilitas mundur.

Namespace File Win32

Awalan dan konvensi namespace Win32 dirangkum di bagian ini dan bagian berikut, dengan deskripsi tentang cara penggunaannya. Perhatikan bahwa contoh-contoh ini ditujukan untuk digunakan dengan fungsi Windows API dan tidak semuanya selalu berfungsi dengan aplikasi shell Windows seperti Windows Explorer. Untuk alasan ini ada berbagai jalur yang mungkin lebih luas daripada yang biasanya tersedia dari aplikasi shell Windows, dan aplikasi Windows yang memanfaatkan ini dapat dikembangkan menggunakan konvensi namespace ini.

Untuk I/O file, awalan "\\?\" ke string jalur memberi tahu API Windows untuk menonaktifkan semua penguraian string dan untuk mengirim string yang mengikutinya langsung ke sistem file. Misalnya, jika sistem file mendukung jalur besar dan nama file, Anda dapat melebihi batas MAX_PATH yang diberlakukan oleh API Windows. Untuk informasi selengkapnya tentang batasan jalur maksimum normal, lihat bagian Sebelumnya Batasan Panjang Jalur Maksimum.

Karena menonaktifkan ekspansi otomatis string jalur, awalan "\\?\" juga memungkinkan penggunaan ".." dan "." dalam nama jalur, yang dapat berguna jika Anda mencoba melakukan operasi pada file dengan penentu jalur relatif yang dicadangkan ini sebagai bagian dari jalur yang sepenuhnya memenuhi syarat.

Banyak tetapi tidak semua API I/O file mendukung "\\?\"; Anda harus melihat topik referensi untuk memastikan setiap API.

Perhatikan bahwa API Unicode harus digunakan untuk memastikan awalan "\\?\" memungkinkan Anda melebihi MAX_PATH.

Namespace Perangkat Win32

Awalan "\\.\" akan mengakses namespace perangkat Win32 alih-alih namespace file Win32. Ini adalah bagaimana akses ke disk fisik dan volume dicapai secara langsung, tanpa melalui sistem file, jika API mendukung jenis akses ini. Anda dapat mengakses banyak perangkat selain disk dengan cara ini (misalnya menggunakan fungsi CreateFile dan DefineDosDevice).

Misalnya, jika Anda ingin membuka port komunikasi serial sistem 1, Anda dapat menggunakan "COM1" dalam panggilan ke fungsi CreateFile. Ini berfungsi karena COM1–COM9 adalah bagian dari nama yang dicadangkan di namespace layanan NT, meskipun menggunakan awalan "\\.\" juga akan berfungsi dengan nama perangkat ini. Sebagai perbandingan, jika Anda memiliki 100 papan ekspansi serial port yang diinstal dan ingin membuka COM56, Anda tidak dapat membukanya menggunakan "COM56" karena tidak ada namespace layanan NT yang telah ditentukan sebelumnya untuk COM56. Anda harus membukanya menggunakan "\\.\COM56" karena "\\.\" langsung masuk ke namespace perangkat tanpa mencoba menemukan alias yang telah ditentukan sebelumnya.

Contoh lain menggunakan namespace perangkat Win32 adalah menggunakan fungsi CreateFile dengan "\\.\PhysicalDriveX" (di mana X adalah nilai bilangan bulat yang valid) atau "\\.\CdRomX". Ini memungkinkan Anda untuk mengakses perangkat tersebut secara langsung, melewati sistem file. Ini berfungsi karena nama perangkat ini dibuat oleh sistem karena perangkat ini dijumlahkan, dan beberapa driver juga akan membuat alias lain dalam sistem. Misalnya, driver perangkat yang mengimplementasikan nama "C:\" memiliki namespace layanan sendiri yang juga kebetulan merupakan sistem file.

API yang melalui fungsi CreateFile umumnya bekerja dengan awalan "\\.\" karena CreateFile adalah fungsi yang digunakan untuk membuka file dan perangkat, tergantung pada parameter yang Anda gunakan.

Jika Anda bekerja dengan fungsi Windows API, Anda harus menggunakan awalan "\\.\" untuk mengakses perangkat saja dan bukan file.

Sebagian besar API tidak akan mendukung "\\.\"; hanya yang dirancang untuk bekerja dengan namespace perangkat yang akan mengenalinya. Selalu periksa topik referensi untuk memastikan setiap API.

Namespace Layanan NT

Ada juga API yang memungkinkan penggunaan konvensi namespace layanan NT, tetapi Windows Object Manager membuat yang tidak perlu dalam banyak kasus. Untuk mengilustrasikan, berguna untuk menelusuri namespace Windows di browser objek sistem menggunakan alat WinObj Windows Sysinternals. Ketika Anda menjalankan alat ini, apa yang Anda lihat adalah namespace layanan NT yang dimulai di root, atau "\". Subfolder yang disebut "Global??" adalah tempat namespace Win32 berada. Objek perangkat bernama berada di namespace layanan NT dalam subdirektori "Perangkat". Di sini Anda juga dapat menemukan Serial0 dan Serial1, objek perangkat yang mewakili dua port COM pertama jika ada di sistem Anda. Objek perangkat yang mewakili volume akan menjadi sesuatu seperti "HarddiskVolume1", meskipun akhiran numerik dapat bervariasi. Nama "DR0" di bawah subdirektori "Harddisk0" adalah contoh objek perangkat yang mewakili disk, dan sebagainya.

Untuk membuat objek perangkat ini dapat diakses oleh aplikasi Windows, driver perangkat membuat tautan simbolis (symlink) di namespace Win32, "Global??", ke objek perangkat masing-masing. Misalnya, COM0 dan COM1 di bawah subdirektori "Global??" hanyalah symlink ke Serial0 dan Serial1, "C:" adalah symlink ke HarddiskVolume1, "Physicaldrive0" adalah symlink ke DR0, dan sebagainya. Tanpa symlink, perangkat tertentu "Xxx" tidak akan tersedia untuk aplikasi Windows apa pun menggunakan konvensi namespace Win32 seperti yang dijelaskan sebelumnya. Namun, handel dapat dibuka ke perangkat tersebut menggunakan API apa pun yang mendukung jalur absolut namespace layanan NT dari format "\Device\Xxx".

Dengan penambahan dukungan multi-pengguna melalui Layanan Terminal dan komputer virtual, semakin diperlukan untuk memvirtualisasi perangkat root di seluruh sistem dalam namespace Win32. Ini dicapai dengan menambahkan symlink bernama "GLOBALROOT" ke namespace Win32, yang dapat Anda lihat di subdirektori "Global??" dari alat browser WinObj yang sebelumnya dibahas, dan dapat mengakses melalui jalur "\\?\GLOBALROOT". Awalan ini memastikan bahwa jalur yang mengikutinya terlihat di jalur akar sebenarnya dari manajer objek sistem dan bukan jalur tergantung sesi.

Lihat juga