Rust WinApi и ReadDirectoryChangesW? Здравствуйте я недавно начал изучать Rust, и хочу знать какой файл был добавлен или был удален в конкретном каталоге.нашел функции winapi::um::winbase::ReadDirectoryChangesW и захотелось реализовать его.#[cfg(windows)] extern crate winapi; use std::ffi::CString; extern crate schedule_recv; use winapi::um::fileapi::{CreateFileA, OPEN_EXISTING}; use winapi::um::winbase::{ReadDirectoryChangesW, FILE_FLAG_BACKUP_SEMANTICS}; use winapi::um::winnt::{FILE_LIST_DIRECTORY, FILE_NOTIFY_CHANGE_FILE_NAME, FILE_SHARE_READ}; fn main() { unsafe { // .. let hDir = CreateFileA( CString::new("C:/Users/Admin/Desktop/tmp/") .unwrap() .as_ptr(), FILE_LIST_DIRECTORY, FILE_SHARE_READ, None.unwrap(), OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, None.unwrap(), ); let x = ReadDirectoryChangesW( hDir, std::ptr::null_mut(), 0, 0, FILE_NOTIFY_CHANGE_FILE_NAME, std::ptr::null_mut(), None.unwrap(), None.unwrap(), ); // ... } } Ошибка. thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src\lib core\option.rs:335:21 note: Run with `RUST_BACKTRACE=1` for a backtrace. error: process didn't exit successfully: `target\debug\fw.exe` (exit code: 101) заранее спасибо
Ошибка указывает на то, что вы пытаетесь вызвать unwrap() на None значении, что приводит к панике. Это происходит потому что вы передаете None в качестве аргументов функций CreateFileA и ReadDirectoryChangesW.
Вы должны изменить код таким образом, чтобы передавать корректные значения в эти функции. Например, для None можно передать значение std::ptr::null_mut(), чтобы указать на нулевой указатель.
Ниже приведен исправленный код:
#[cfg(windows)] extern crate winapi; use std::ffi::CString; use winapi::um::fileapi::{CreateFileA, OPEN_EXISTING}; use winapi::um::winbase::{ReadDirectoryChangesW, FILE_FLAG_BACKUP_SEMANTICS}; use winapi::um::winnt::{FILE_LIST_DIRECTORY, FILE_NOTIFY_CHANGE_FILE_NAME, FILE_SHARE_READ}; fn main() { unsafe { let hDir = CreateFileA( CString::new("C:/Users/Admin/Desktop/tmp/").unwrap().as_ptr(), FILE_LIST_DIRECTORY, FILE_SHARE_READ, std::ptr::null_mut(), OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, std::ptr::null_mut(), ); let buffer: [u8; 1024] = [0; 1024]; let mut bytes_returned: u32 = 0; let overlapped: *mut winapi::um::minwinbase::OVERLAPPED = std::ptr::null_mut(); let x = ReadDirectoryChangesW( hDir, buffer.as_ptr() as *mut _, buffer.len() as u32, 1, /* Recursive: True */ FILE_NOTIFY_CHANGE_FILE_NAME, &mut bytes_returned, overlapped, None, ); // Handle the result of ReadDirectoryChangesW here // ... // Close handle when done winapi::um::handleapi::CloseHandle(hDir); } }
Пожалуйста, уделите внимание тому, что вам также потребуется обработать результат функции ReadDirectoryChangesW и закрыть используемый дескриптор файла с помощью CloseHandle после завершения обработки изменений в каталоге.
Ошибка указывает на то, что вы пытаетесь вызвать unwrap() на None значении, что приводит к панике. Это происходит потому что вы передаете None в качестве аргументов функций CreateFileA и ReadDirectoryChangesW.
Вы должны изменить код таким образом, чтобы передавать корректные значения в эти функции. Например, для None можно передать значение std::ptr::null_mut(), чтобы указать на нулевой указатель.
Ниже приведен исправленный код:
#[cfg(windows)]extern crate winapi;
use std::ffi::CString;
use winapi::um::fileapi::{CreateFileA, OPEN_EXISTING};
use winapi::um::winbase::{ReadDirectoryChangesW, FILE_FLAG_BACKUP_SEMANTICS};
use winapi::um::winnt::{FILE_LIST_DIRECTORY, FILE_NOTIFY_CHANGE_FILE_NAME, FILE_SHARE_READ};
fn main() {
unsafe {
let hDir = CreateFileA(
CString::new("C:/Users/Admin/Desktop/tmp/").unwrap().as_ptr(),
FILE_LIST_DIRECTORY,
FILE_SHARE_READ,
std::ptr::null_mut(),
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
std::ptr::null_mut(),
);
let buffer: [u8; 1024] = [0; 1024];
let mut bytes_returned: u32 = 0;
let overlapped: *mut winapi::um::minwinbase::OVERLAPPED = std::ptr::null_mut();
let x = ReadDirectoryChangesW(
hDir,
buffer.as_ptr() as *mut _,
buffer.len() as u32,
1, /* Recursive: True */
FILE_NOTIFY_CHANGE_FILE_NAME,
&mut bytes_returned,
overlapped,
None,
);
// Handle the result of ReadDirectoryChangesW here
// ...
// Close handle when done
winapi::um::handleapi::CloseHandle(hDir);
}
}
Пожалуйста, уделите внимание тому, что вам также потребуется обработать результат функции ReadDirectoryChangesW и закрыть используемый дескриптор файла с помощью CloseHandle после завершения обработки изменений в каталоге.