diff options
author | Yuriy Glukhov <yglukhov@users.noreply.github.com> | 2017-07-21 18:20:21 +0300 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-07-21 17:20:21 +0200 |
commit | bbbf5cf800ef0f5f09a840f4ae0ccc80661b5548 (patch) | |
tree | 4b7cd3565374beb4cca8208642f0c28de133f34f /lib/pure/asyncfile.nim | |
parent | b9223479907152e1bd186065d9c19f844940224a (diff) | |
download | Nim-bbbf5cf800ef0f5f09a840f4ae0ccc80661b5548.tar.gz |
Added newAsyncFile proc (#6129)
Diffstat (limited to 'lib/pure/asyncfile.nim')
-rw-r--r-- | lib/pure/asyncfile.nim | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/lib/pure/asyncfile.nim b/lib/pure/asyncfile.nim index 8fb30075c..9f4da16a3 100644 --- a/lib/pure/asyncfile.nim +++ b/lib/pure/asyncfile.nim @@ -81,27 +81,32 @@ proc getFileSize*(f: AsyncFile): int64 = else: result = lseek(f.fd.cint, 0, SEEK_END) +proc newAsyncFile*(fd: AsyncFd): AsyncFile = + ## Creates `AsyncFile` with a previously opened file descriptor `fd`. + new result + result.fd = fd + register(result.fd) + proc openAsync*(filename: string, mode = fmRead): AsyncFile = ## Opens a file specified by the path in ``filename`` using ## the specified ``mode`` asynchronously. - new result when defined(windows) or defined(nimdoc): let flags = FILE_FLAG_OVERLAPPED or FILE_ATTRIBUTE_NORMAL let desiredAccess = getDesiredAccess(mode) let creationDisposition = getCreationDisposition(mode, filename) when useWinUnicode: - result.fd = createFileW(newWideCString(filename), desiredAccess, + let fd = createFileW(newWideCString(filename), desiredAccess, FILE_SHARE_READ, nil, creationDisposition, flags, 0).AsyncFd else: - result.fd = createFileA(filename, desiredAccess, + let fd = createFileA(filename, desiredAccess, FILE_SHARE_READ, nil, creationDisposition, flags, 0).AsyncFd - if result.fd.Handle == INVALID_HANDLE_VALUE: + if fd.Handle == INVALID_HANDLE_VALUE: raiseOSError(osLastError()) - register(result.fd) + result = newAsyncFile(fd) if mode == fmAppend: result.offset = getFileSize(result) @@ -110,11 +115,11 @@ proc openAsync*(filename: string, mode = fmRead): AsyncFile = let flags = getPosixFlags(mode) # RW (Owner), RW (Group), R (Other) let perm = S_IRUSR or S_IWUSR or S_IRGRP or S_IWGRP or S_IROTH - result.fd = open(filename, flags, perm).AsyncFD - if result.fd.cint == -1: + let fd = open(filename, flags, perm).AsyncFD + if fd.cint == -1: raiseOSError(osLastError()) - register(result.fd) + result = newAsyncFile(fd) proc readBuffer*(f: AsyncFile, buf: pointer, size: int): Future[int] = ## Read ``size`` bytes from the specified file asynchronously starting at |