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)
заранее спасибо

21 Авг 2019 в 06:21
252 +1
1
Ответы
1

Ошибка указывает на то, что вы пытаетесь вызвать unwrap на None значении, что приводит к панике. Это происходит потому что вы передаете None в качестве аргументов функций CreateFileA и ReadDirectoryChangesW.

Вы должны изменить код таким образом, чтобы передавать корректные значения в эти функции. Например, для None можно передать значение std::ptr::null_mut, чтобы указать на нулевой указатель.

Ниже приведен исправленный код:

#cfg(windows)cfg(windows)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 = CreateFileACString::new("C:/Users/Admin/Desktop/tmp/").unwrap().asptr(),FILELISTDIRECTORY,FILESHAREREAD,std::ptr::nullmut(),OPENEXISTING,FILEFLAGBACKUPSEMANTICS,std::ptr::nullmut(), 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(),
CString::new("C:/Users/Admin/Desktop/tmp/").unwrap().asp tr(),FILEL ISTD IRECTORY,FILES HARER EAD,std::ptr::nullm ut(),OPENE XISTING,FILEF LAGB ACKUPS EMANTICS,std::ptr::nullm ut(),
;
let buffer: u8;1024u8; 1024u8;1024 = 0;10240; 10240;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::CloseHandlehDirhDirhDir;
}
}

Пожалуйста, уделите внимание тому, что вам также потребуется обработать результат функции ReadDirectoryChangesW и закрыть используемый дескриптор файла с помощью CloseHandle после завершения обработки изменений в каталоге.

20 Апр 2024 в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир