summaryrefslogtreecommitdiff
path: root/src/devices/file_device/operations.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/file_device/operations.rs')
-rw-r--r--src/devices/file_device/operations.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/devices/file_device/operations.rs b/src/devices/file_device/operations.rs
new file mode 100644
index 0000000..3a3f81b
--- /dev/null
+++ b/src/devices/file_device/operations.rs
@@ -0,0 +1,47 @@
+use std::io::ErrorKind;
+use std::path::Path;
+
+
+/// Create a new file if it doesn't already exist, returning true if successful.
+pub fn create_file(destination: &Path) -> bool {
+ if entry_exists(destination) {
+ false
+ } else {
+ if let Some(parent_path) = destination.parent() {
+ let _ = std::fs::create_dir_all(parent_path);
+ }
+ std::fs::OpenOptions::new().write(true).create_new(true)
+ .open(destination).is_ok()
+ }
+}
+
+/// Move an entry from one location to another, returning true if successful.
+pub fn move_entry(source: &Path, destination: &Path) -> bool {
+ if !entry_exists(source) || entry_exists(destination) {
+ return false;
+ }
+ std::fs::rename(source, destination).is_ok()
+}
+
+/// Delete an entry, returning true if successful.
+pub fn delete_entry(source: &Path) -> bool {
+ match std::fs::remove_file(source) {
+ Ok(_) => true,
+ Err(e) => match e.kind() {
+ ErrorKind::NotFound => true,
+ ErrorKind::IsADirectory => match std::fs::remove_dir_all(source) {
+ Ok(_) => true,
+ Err(e) => match e.kind() {
+ ErrorKind::NotFound => true,
+ _ => false,
+ }
+ }
+ _ => false,
+ }
+ }
+}
+
+/// Returns true if an entry already exists at the given path.
+fn entry_exists(source: &Path) -> bool {
+ std::fs::metadata(source).is_ok()
+}