Merge pull request #1658 from aarroyoc/copy_file
Add predicate file_copy/2 in library(files)
This commit is contained in:
@@ -70,8 +70,9 @@ In this library, directories and files are represented as
|
||||
file_exists/1,
|
||||
directory_exists/1,
|
||||
delete_file/1,
|
||||
rename_file/2,
|
||||
delete_directory/1,
|
||||
rename_file/2,
|
||||
file_copy/2,
|
||||
delete_directory/1,
|
||||
make_directory/1,
|
||||
make_directory_path/1,
|
||||
working_directory/2,
|
||||
@@ -150,6 +151,14 @@ rename_file(File, Renamed) :-
|
||||
must_be(chars, Renamed),
|
||||
'$rename_file'(File, Renamed).
|
||||
|
||||
%% file_copy(+File, +Copied).
|
||||
%
|
||||
% Succeeds if File is copied to Copied
|
||||
file_copy(File, Copied) :-
|
||||
file_must_exist(File, file_copy/2),
|
||||
must_be(chars, Copied),
|
||||
'$file_copy'(File, Copied).
|
||||
|
||||
%% delete_directory(+Directory).
|
||||
%
|
||||
% Succeeds if Directory is deleted from the current system.
|
||||
|
||||
@@ -3533,6 +3533,14 @@ impl Machine {
|
||||
self.rename_file();
|
||||
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
|
||||
}
|
||||
&Instruction::CallFileCopy(_) => {
|
||||
self.file_copy();
|
||||
step_or_fail!(self, self.machine_st.p += 1);
|
||||
}
|
||||
&Instruction::ExecuteFileCopy(_) => {
|
||||
self.file_copy();
|
||||
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
|
||||
}
|
||||
&Instruction::CallWorkingDirectory(_) => {
|
||||
try_or_throw!(self.machine_st, self.working_directory());
|
||||
step_or_fail!(self, self.machine_st.p += 1);
|
||||
|
||||
@@ -1653,6 +1653,19 @@ impl Machine {
|
||||
self.machine_st.fail = true;
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn file_copy(&mut self) {
|
||||
if let Some(file) = self.machine_st.value_to_str_like(self.machine_st.registers[1]) {
|
||||
if let Some(copied) = self.machine_st.value_to_str_like(self.machine_st.registers[2]) {
|
||||
if fs::copy(file.as_str(), copied.as_str()).is_ok() {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.machine_st.fail = true;
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn delete_directory(&mut self) {
|
||||
if let Some(dir) = self.machine_st.value_to_str_like(self.machine_st.registers[1]) {
|
||||
|
||||
Reference in New Issue
Block a user