os: add overload copyFile*(source, dest: string, isDir = false) (#15537)

* os: add overload copyFile*(source, dest: string, isDir = false)
* renamed to copyFileToDir
This commit is contained in:
Timothee Cour
2020-10-11 11:43:01 -07:00
committed by GitHub
parent 992952d868
commit 3eac9b2344
3 changed files with 27 additions and 1 deletions

View File

@@ -209,6 +209,7 @@
- Added `progressInterval` argument to `asyncftpclient.newAsyncFtpClient` to control the interval
at which progress callbacks are called.
- Added `os.copyFileToDir`
## Language changes

View File

@@ -1682,7 +1682,7 @@ proc setFilePermissions*(filename: string, permissions: set[FilePermission]) {.
proc copyFile*(source, dest: string) {.rtl, extern: "nos$1",
tags: [ReadIOEffect, WriteIOEffect], noWeirdTarget.} =
## Copies a file from `source` to `dest`.
## Copies a file from `source` to `dest`, where `dest.parentDir` must exist.
##
## If this fails, `OSError` is raised.
##
@@ -1738,6 +1738,12 @@ proc copyFile*(source, dest: string) {.rtl, extern: "nos$1",
flushFile(d)
close(d)
proc copyFileToDir*(source, dir: string) {.noWeirdTarget, since: (1,3,7).} =
## Copies a file `source` into directory `dir`, which must exist.
if dir.len == 0: # treating "" as "." is error prone
raise newException(ValueError, "dest is empty")
copyFile(source, dir / source.lastPathPart)
when not declared(ENOENT) and not defined(Windows):
when NoFakeVars:
when not defined(haiku):

View File

@@ -36,6 +36,25 @@ block fileOperations:
createDir(dname)
doAssert dirExists(dname)
block: # copyFile, copyFileToDir
doAssertRaises(OSError): copyFile(dname/"nonexistant.txt", dname/"nonexistant.txt")
let fname = "D20201009T112235"
let fname2 = "D20201009T112235.2"
writeFile(dname/fname, "foo")
let sub = "sub"
doAssertRaises(OSError): copyFile(dname/fname, dname/sub/fname2)
doAssertRaises(OSError): copyFileToDir(dname/fname, dname/sub)
doAssertRaises(ValueError): copyFileToDir(dname/fname, "")
copyFile(dname/fname, dname/fname2)
doAssert fileExists(dname/fname2)
createDir(dname/sub)
copyFileToDir(dname/fname, dname/sub)
doAssert fileExists(dname/sub/fname)
removeDir(dname/sub)
doAssert not dirExists(dname/sub)
removeFile(dname/fname)
removeFile(dname/fname2)
# Test creating files and dirs
for dir in dirs:
createDir(dname/dir)