summaryrefslogtreecommitdiffstats
path: root/src/io/io_worker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/io/io_worker.rs')
-rw-r--r--src/io/io_worker.rs166
1 files changed, 82 insertions, 84 deletions
diff --git a/src/io/io_worker.rs b/src/io/io_worker.rs
index 58347ee..97af52a 100644
--- a/src/io/io_worker.rs
+++ b/src/io/io_worker.rs
@@ -117,7 +117,7 @@ impl IOWorkerThread {
for (i, path) in self.paths.iter().enumerate() {
progress.set_index(i);
let _ = tx.send(progress.clone());
- self.recursive_copy(
+ recursive_copy(
path.as_path(),
self.dest.as_path(),
tx.clone(),
@@ -132,52 +132,12 @@ impl IOWorkerThread {
))
}
- fn recursive_copy(
- &self,
- src: &path::Path,
- dest: &path::Path,
- tx: mpsc::Sender<IOWorkerProgress>,
- progress: &mut IOWorkerProgress,
- ) -> std::io::Result<()> {
- let mut dest_buf = dest.to_path_buf();
- if let Some(s) = src.file_name() {
- dest_buf.push(s);
- }
- rename_filename_conflict(&mut dest_buf);
- let file_type = fs::symlink_metadata(src)?.file_type();
- if file_type.is_dir() {
- fs::create_dir(dest_buf.as_path())?;
- for entry in fs::read_dir(src)? {
- let entry = entry?;
- let entry_path = entry.path();
- self.recursive_copy(
- entry_path.as_path(),
- dest_buf.as_path(),
- tx.clone(),
- progress,
- )?;
- let _ = tx.send(progress.clone());
- }
- Ok(())
- } else if file_type.is_file() {
- let processed = progress.processed() + fs::copy(src, dest_buf)?;
- progress.set_processed(processed);
- Ok(())
- } else if file_type.is_symlink() {
- let link_path = fs::read_link(src)?;
- std::os::unix::fs::symlink(link_path, dest_buf)?;
- Ok(())
- } else {
- Ok(())
- }
- }
-
fn paste_cut(&self, tx: mpsc::Sender<IOWorkerProgress>) -> std::io::Result<IOWorkerProgress> {
let mut progress = IOWorkerProgress::new(self.kind(), 0, self.paths.len(), 0);
for (i, path) in self.paths.iter().enumerate() {
progress.set_index(i);
let _ = tx.send(progress.clone());
- self.recursive_cut(
+ recursive_cut(
path.as_path(),
self.dest.as_path(),
tx.clone(),
@@ -191,55 +151,93 @@ impl IOWorkerThread {
progress.processed(),
))
}
+}
- pub fn recursive_cut(
- &self,
- src: &path::Path,
- dest: &path::Path,
- tx: mpsc::Sender<IOWorkerProgress>,
- progress: &mut IOWorkerProgress,
- ) -> std::io::Result<()> {
- let mut dest_buf = dest.to_path_buf();
- if let Some(s) = src.file_name() {
- dest_buf.push(s);
+pub fn recursive_copy(
+ src: &path::Path,
+ dest: &path::Path,
+ tx: mpsc::Sender<IOWorkerProgress>,
+ progress: &mut IOWorkerProgress,
+) -> std::io::Result<()> {
+ let mut dest_buf = dest.to_path_buf();
+ if let Some(s) = src.file_name() {
+ dest_buf.push(s);
+ }
+ rename_filename_conflict(&mut dest_buf);
+ let file_type = fs::symlink_metadata(src)?.file_type();
+ if file_type.is_dir() {
+ fs::create_dir(dest_buf.as_path())?;
+ for entry in fs::read_dir(src)? {
+ let entry = entry?;
+ let entry_path = entry.path();
+ recursive_copy(
+ entry_path.as_path(),
+ dest_buf.as_path(),
+ tx.clone(),
+ progress,
+ )?;
+ let _ = tx.send(progress.clone());
}
- rename_filename_conflict(&mut dest_buf);
- let metadata = fs::symlink_metadata(src)?;
- let file_type = metadata.file_type();
- if file_type.is_dir() {
- match fs::rename(src, dest_buf.as_path()) {
- Ok(_) => {
- let processed = progress.processed() + metadata.len();
- progress.set_processed(processed);
- }
- Err(_) => {
- fs::create_dir(dest_buf.as_path())?;
- for entry in fs::read_dir(src)? {
- let entry_path = entry?.path();
- self.recursive_cut(
- entry_path.as_path(),
- dest_buf.as_path(),
- tx.clone(),
- progress,
- )?;
- }
- fs::remove_dir(src)?;
- }
- }
- } else if file_type.is_file() {
- if fs::rename(src, dest_buf.as_path()).is_err() {
- fs::copy(src, dest_buf.as_path())?;
- fs::remove_file(src)?;
+ Ok(())
+ } else if file_type.is_file() {
+ let processed = progress.processed() + fs::copy(src, dest_buf)?;
+ progress.set_processed(processed);
+ Ok(())
+ } else if file_type.is_symlink() {
+ let link_path = fs::read_link(src)?;
+ std::os::unix::fs::symlink(link_path, dest_buf)?;
+ Ok(())
+ } else {
+ Ok(())
+ }
+}
+
+pub fn recursive_cut(
+ src: &path::Path,
+ dest: &path::Path,
+ tx: mpsc::Sender<IOWorkerProgress>,
+ progress: &mut IOWorkerProgress,
+) -> std::io::Result<()> {
+ let mut dest_buf = dest.to_path_buf();
+ if let Some(s) = src.file_name() {
+ dest_buf.push(s);
+ }
+ rename_filename_conflict(&mut dest_buf);
+ let metadata = fs::symlink_metadata(src)?;
+ let file_type = metadata.file_type();
+ if file_type.is_dir() {
+ match fs::rename(src, dest_buf.as_path()) {
+ Ok(_) => {
let processed = progress.processed() + metadata.len();
progress.set_processed(processed);
}
- } else if file_type.is_symlink() {
- let link_path = fs::read_link(src)?;
- std::os::unix::fs::symlink(link_path, dest_buf)?;
+ Err(_) => {
+ fs::create_dir(dest_buf.as_path())?;
+ for entry in fs::read_dir(src)? {
+ let entry_path = entry?.path();
+ recursive_cut(
+ entry_path.as_path(),
+ dest_buf.as_path(),
+ tx.clone(),
+ progress,
+ )?;
+ }
+ fs::remove_dir(src)?;
+ }
+ }
+ } else if file_type.is_file() {
+ if fs::rename(src, dest_buf.as_path()).is_err() {
+ fs::copy(src, dest_buf.as_path())?;
fs::remove_file(src)?;
let processed = progress.processed() + metadata.len();
progress.set_processed(processed);
}
- Ok(())
- }
+ } else if file_type.is_symlink() {
+ let link_path = fs::read_link(src)?;
+ std::os::unix::fs::symlink(link_path, dest_buf)?;
+ fs::remove_file(src)?;
+ let processed = progress.processed() + metadata.len();
+ progress.set_processed(processed);
+ }
+ Ok(())
}