Fungsi ReadFile (fileapi.h)
Membaca data dari perangkat file atau input/output (I/O) yang ditentukan. Pembacaan terjadi pada posisi yang ditentukan oleh penunjuk file jika didukung oleh perangkat.
Fungsi ini dirancang untuk operasi sinkron dan asinkron. Untuk fungsi serupa yang dirancang hanya untuk operasi asinkron, lihat ReadFileEx.
Sintaksis
BOOL ReadFile(
[in] HANDLE hFile,
[out] LPVOID lpBuffer,
[in] DWORD nNumberOfBytesToRead,
[out, optional] LPDWORD lpNumberOfBytesRead,
[in, out, optional] LPOVERLAPPED lpOverlapped
);
Parameter
[in] hFile
Handel ke perangkat (misalnya, file, aliran file, disk fisik, volume, buffer konsol, tape drive, soket, sumber daya komunikasi, mailslot, atau pipa).
Parameter hFile harus dibuat dengan akses baca. Untuk informasi selengkapnya, lihat Hak Akses Generik dan Keamanan File dan Hak Akses.
Untuk operasi baca asinkron,
[out] lpBuffer
Penunjuk ke buffer yang menerima data yang dibaca dari file atau perangkat.
Buffer ini harus tetap valid selama durasi operasi baca. Pemanggil tidak boleh menggunakan buffer ini hingga operasi baca selesai.
[in] nNumberOfBytesToRead
Jumlah maksimum byte yang akan dibaca.
[out, optional] lpNumberOfBytesRead
Penunjuk ke variabel yang menerima jumlah byte yang dibaca saat menggunakan parameter hFile
Parameter ini dapat
Windows 7: Parameter ini tidak dapat NULL.
Untuk informasi selengkapnya, lihat bagian Keterangan.
[in, out, optional] lpOverlapped
Penunjuk ke struktur
Jika
Untuk hFile
Untuk informasi selengkapnya tentang kombinasi
Mengembalikan nilai
Jika fungsi berhasil, nilai pengembalian bukan nol (TRUE).
Jika fungsi gagal, atau menyelesaikan secara asinkron, nilai yang dikembalikan adalah nol (FALSE). Untuk mendapatkan informasi kesalahan yang diperluas, panggil fungsi GetLastError
Nota
Komentar
Fungsi ReadFile
- Jumlah byte yang diminta dibaca.
- Operasi tulis selesai pada akhir tulis pipa.
- Handel asinkron sedang digunakan dan bacaan terjadi secara asinkron.
- Terjadi kesalahan.
Fungsi
Untuk membatalkan semua operasi I/O asinkron yang tertunda, gunakan:
- CancelIo: Fungsi ini hanya membatalkan operasi yang dikeluarkan oleh utas panggilan untuk handel file yang ditentukan.
- CancelIoEx: Fungsi ini membatalkan semua operasi yang dikeluarkan oleh utas untuk handel file yang ditentukan.
Gunakan CancelSynchronousIo untuk membatalkan operasi I/O sinkron yang tertunda.
Operasi I/O yang dibatalkan selesai dengan kesalahan ERROR_OPERATION_ABORTED.
Fungsi
Jika bagian dari file dikunci oleh proses lain dan operasi baca tumpang tindih dengan bagian terkunci, fungsi ini gagal.
Mengakses buffer input saat operasi baca menggunakan buffer dapat menyebabkan kerusakan data yang dibaca ke dalam buffer tersebut. Aplikasi tidak boleh membaca dari, menulis ke, mengalokasikan ulang, atau membebaskan buffer input yang digunakan operasi baca hingga operasi baca selesai. Ini bisa sangat bermasalah saat menggunakan handel file asinkron. Informasi tambahan mengenai handel file sinkron versus asinkron dapat ditemukan di bagian Sinkronisasi dan Posisi File
Karakter dapat dibaca dari buffer input konsol dengan menggunakan ReadFile dengan handel ke input konsol. Mode konsol menentukan perilaku yang tepat dari fungsi
Saat membaca dari perangkat komunikasi, perilaku
Jika
Ada persyaratan ketat untuk berhasil bekerja dengan file yang dibuka dengan CreateFile menggunakan bendera FILE_FLAG_NO_BUFFERING. Untuk detailnya, lihat Buffering File .
Jika hFile dibuka dengan FILE_FLAG_OVERLAPPED, kondisi berikut berlaku:
- Parameter
lpOverlapped harus menunjuk ke struktur yang valid dan unik TUMPANG TINDIH, jika tidak, fungsi dapat salah melaporkan bahwa operasi baca selesai. - Parameter
lpNumberOfBytesRead harus diatur ke getOverlappedResultNULL . Gunakan fungsiuntuk mendapatkan jumlah byte aktual yang dibaca. Jika parameter hFiledikaitkan dengan port penyelesaian I/O, Anda juga bisa mendapatkan jumlah byte yang dibaca dengan memanggil fungsi GetQueuedCompletionStatus .
Sinkronisasi dan Posisi File
Jika hFile dibuka dengan FILE_FLAG_OVERLAPPED, itu adalah handel file asinkron; jika tidak, itu sinkron. Aturan untuk menggunakan struktur
Nota
Jika file atau perangkat dibuka untuk I/O asinkron, panggilan berikutnya ke fungsi seperti ReadFile menggunakan handel tersebut umumnya segera kembali, tetapi juga dapat berperilaku sinkron sehubungan dengan eksekusi yang diblokir. Untuk informasi selengkapnya, lihat I/O disk asinkron muncul sebagai sinkron di Windows.
Pertimbangan untuk bekerja dengan handel file asinkron:
-
ReadFile dapat kembali sebelum operasi baca selesai. Dalam skenario ini,
ReadFile mengembalikanFALSE dan fungsi GetLastErrormengembalikan ERROR_IO_PENDING , yang memungkinkan proses panggilan berlanjut saat sistem menyelesaikan operasi baca. - Parameter
lpOverlapped tidak boleh NULL dan harus digunakan dengan ingat fakta berikut: - Meskipun peristiwa yang ditentukan dalam struktur
TUMPANG TINDIH diatur dan diatur ulang secara otomatis oleh sistem, offset yang ditentukan dalam struktur TUMPANG TINDIH tidak diperbarui secara otomatis. - ReadFile mengatur ulang peristiwa ke status yang tidak ditandatangani saat memulai operasi I/O.
- Peristiwa yang ditentukan dalam struktur
TUMPANG TINDIH diatur ke status yang disinyalir saat operasi baca selesai; hingga saat itu, operasi baca dianggap tertunda. - Karena operasi baca dimulai pada offset yang ditentukan dalam struktur
TUMPANG TINDIH, dan ReadFile dapat kembali sebelum operasi baca tingkat sistem selesai (baca tertunda), baik offset maupun bagian lain dari struktur harus dimodifikasi, dibebaskan, atau digunakan kembali oleh aplikasi sampai peristiwa disinyalir (yaitu, baca selesai). - Jika end-of-file (EOF) terdeteksi selama operasi asinkron, panggilan ke getOverlappedResult
untuk operasi tersebut mengembalikan FALSE dan GetLastError mengembalikanERROR_HANDLE_EOF .
- Meskipun peristiwa yang ditentukan dalam struktur
Pertimbangan untuk bekerja dengan handel file sinkron:
- Jika lpOverlapped
NULL , operasi baca dimulai pada posisi file saat ini danReadFile tidak kembali hingga operasi selesai, dan sistem memperbarui penunjuk file sebelum ReadFile kembali. - Jika
lpOverlapped tidaknull , operasi baca dimulai pada offset yang ditentukan dalam strukturTUMPANG TINDIH dan ReadFile tidak kembali sampai operasi baca selesai. Sistem memperbarui offset TUMPANG TINDIH dan penunjuk file sebelum ReadFile kembali. - Jika
lpOverlapped NULL , maka ketika operasi baca sinkron mencapai akhir file, ReadFilemengembalikan TRUE dan menetapkan ke nol. - Jika
lpOverlapped tidaknull , maka ketika operasi baca sinkron mencapai akhir file,ReadFile mengembalikan FALSEdan GetLastError mengembalikanERROR_HANDLE_EOF .
Untuk informasi selengkapnya, lihat CreateFile dan I/O Sinkron dan Asinkron .
Pipa
Jika pipa anonim sedang digunakan dan handel tulis telah ditutup, ketika
Jika pipa bernama sedang dibaca dalam mode pesan dan pesan berikutnya lebih panjang dari parameter
Jika parameter
Untuk informasi selengkapnya tentang pipa, lihat Pipes.
Operasi Yang Ditransaksikan
Jika ada transaksi yang terikat ke handel file, maka fungsi mengembalikan data dari tampilan file yang ditransaksikan. Handel baca yang ditransaksikan dijamin untuk menampilkan tampilan file yang sama selama durasi handel. Untuk informasi selengkapnya, lihat TentangTransaksi NTFS .
Di Windows 8 dan Windows Server 2012, fungsi ini didukung oleh teknologi berikut.
Teknologi | Didukung |
---|---|
Protokol Server Message Block (SMB) 3.0 | Ya |
Failover Transparan (TFO) SMB 3.0 | Ya |
SMB 3.0 dengan Scale-out File Shares (SO) | Ya |
Sistem File Volume Bersama Kluster (CsvFS) | Ya |
Sistem File Tangguh (ReFS) | Ya |
Contoh
Untuk contoh kode yang menunjukkan kepada Anda cara menguji akhir file, lihat Pengujian untuk Akhir File. Untuk contoh lain, lihat Membuat dan Menggunakan File Sementara dan Membuka File untuk Membaca atau Menulis.
Persyaratan
Syarat | Nilai |
---|---|
klien minimum yang didukung | Windows XP [aplikasi desktop | Aplikasi UWP] |
server minimum yang didukung |
Windows Server 2003 [aplikasi desktop | Aplikasi UWP] |
Platform Target |
Windows |
Header |
fileapi.h (termasuk Windows.h) |
Pustaka |
Kernel32.lib |
DLL |
Kernel32.dll |
Lihat juga
ReadFileEx
WriteFile