Speed up walkDir significantly
We only know that this works on Linux and Mac OS X, so other systems use the POSIX conforming version still. This removed the lstat call, which is especially expensive on NFS filesystems for me.
This commit is contained in:
parent
752052e903
commit
1adebdc767
2 changed files with 20 additions and 3 deletions
|
|
@ -70,6 +70,16 @@ const
|
||||||
STDIN_FILENO* = 0 ## File number of stdin;
|
STDIN_FILENO* = 0 ## File number of stdin;
|
||||||
STDOUT_FILENO* = 1 ## File number of stdout;
|
STDOUT_FILENO* = 1 ## File number of stdout;
|
||||||
|
|
||||||
|
DT_UNKNOWN* = 0
|
||||||
|
DT_FIFO* = 1
|
||||||
|
DT_CHR* = 2
|
||||||
|
DT_DIR* = 4
|
||||||
|
DT_BLK* = 6
|
||||||
|
DT_REG* = 8
|
||||||
|
DT_LNK* = 10
|
||||||
|
DT_SOCK* = 12
|
||||||
|
DT_WHT* = 14
|
||||||
|
|
||||||
type
|
type
|
||||||
TDIR* {.importc: "DIR", header: "<dirent.h>",
|
TDIR* {.importc: "DIR", header: "<dirent.h>",
|
||||||
incompleteStruct.} = object
|
incompleteStruct.} = object
|
||||||
|
|
@ -84,6 +94,9 @@ type
|
||||||
Tdirent* {.importc: "struct dirent",
|
Tdirent* {.importc: "struct dirent",
|
||||||
header: "<dirent.h>", final, pure.} = object ## dirent_t struct
|
header: "<dirent.h>", final, pure.} = object ## dirent_t struct
|
||||||
d_ino*: Tino ## File serial number.
|
d_ino*: Tino ## File serial number.
|
||||||
|
d_off*: TOff
|
||||||
|
d_reclen*: cshort
|
||||||
|
d_type*: int8
|
||||||
d_name*: array [0..255, char] ## Name of entry.
|
d_name*: array [0..255, char] ## Name of entry.
|
||||||
|
|
||||||
Tflock* {.importc: "struct flock", final, pure,
|
Tflock* {.importc: "struct flock", final, pure,
|
||||||
|
|
|
||||||
|
|
@ -1299,8 +1299,12 @@ iterator walkDir*(dir: string): tuple[kind: PathComponent, path: string] {.
|
||||||
if y != "." and y != "..":
|
if y != "." and y != "..":
|
||||||
var s: TStat
|
var s: TStat
|
||||||
y = dir / y
|
y = dir / y
|
||||||
if lstat(y, s) < 0'i32: break
|
|
||||||
var k = pcFile
|
var k = pcFile
|
||||||
|
when defined(linux) or defined(macosx):
|
||||||
|
if x.d_type == DT_DIR: k = pcDir
|
||||||
|
if x.d_type == DT_LNK: k = succ(k)
|
||||||
|
else:
|
||||||
|
if lstat(y, s) < 0'i32: break
|
||||||
if S_ISDIR(s.st_mode): k = pcDir
|
if S_ISDIR(s.st_mode): k = pcDir
|
||||||
if S_ISLNK(s.st_mode): k = succ(k)
|
if S_ISLNK(s.st_mode): k = succ(k)
|
||||||
yield (k, y)
|
yield (k, y)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue