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
227 +1
1
Ответы
1

Ошибка указывает на то, что вы пытаетесь вызвать 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 после завершения обработки изменений в каталоге.

20 Апр в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир