sxyazi/yazi · error · io::Error
DirectoryNotEmpty
DirectoryNotEmpty
Error message
trash directory is not empty
What it means
Windows trash removal guard in `Trash::remove_dir`: the entry refers to a trash sub-directory whose resolved item still contains files. To avoid destroying unrecoverable content, directory entries are only removed when empty; otherwise `DirectoryNotEmpty` is returned.
Source
Thrown at yazi-fs/src/trash/windows/trash.rs:91
let cha = if let Some(entry) = entry {
TrashSig::item(&self.resolve(entry)?)?
} else {
TrashSig::root()?
};
Ok(if cha.hits(current.cha) { None } else { Some(File { cha, ..current.clone() }) })
}
pub(crate) fn remove_file(&self, entry: &TrashEntry) -> io::Result<()> {
self.resolve(entry)?.delete()
}
pub(crate) fn remove_dir(&self, entry: &TrashEntry) -> io::Result<()> {
let item = self.resolve(entry)?;
if !entry.has_rel() {
item.delete()
} else if !item.is_empty()? {
Err(io::Error::new(io::ErrorKind::DirectoryNotEmpty, "trash directory is not empty"))
} else {
item.delete()
}
}
pub(crate) fn restore(&self, entries: TrashEntries) -> io::Result<()> {
for entry in entries {
let to = entry.original.as_deref().ok_or_else(|| {
io::Error::new(io::ErrorKind::NotFound, "trash item has no put-back location")
})?;
self.restore_do(&self.resolve(&entry)?, to)?;
}
Ok(())
}
pub(crate) fn rename(&self, entry: &TrashEntry, path: &Path) -> io::Result<()> {
fs::rename(&entry.backing, path)View on GitHub (pinned to 5f901b886b)
Solutions
- Empty the trash directory first (remove its contained items).
- Remove the individual items inside the directory instead of the directory itself.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at yazi-fs/src/trash/windows/trash.rs:91 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of sxyazi/yazi@5f901b886b (2026-09-02).
Data as JSON: /api/errors/64e25316ecba1b03.
Report an issue: GitHub.