1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
/*
module owner: Ronny Wichers Schreur
This module contains some file functions that are not in StdEnv
It uses the object file from Directory 1.1, but with a different
(stripped down) interface.
*/
implementation module filesystem
import StdEnv
// the import code is in CoclSystemDependent, because it is system dependent
// BEGIN copied from Directory.icl
createDirectoryC :: !String !*env -> (!Int, !*env)
createDirectoryC _ _
= code
{
ccall createDirectoryC "S:I:A"
}
findSingleFileC :: !String !*env -> (!ErrCode, !*env)
findSingleFileC _ _
= code
{
ccall findSingleFileC "S:I:A"
}
:: ErrCode :== Int // <>0 <=> error
:: DateTimeTuple :== (!DateTuple, !TimeTuple)
:: DateTuple :== (!Int, !Int, !Int, !Int)
:: TimeTuple :== (!Int, !Int, !Int)
getCommonFileInfoC :: !Bool !*env
-> (!(!String, !(!Int, !Int), !DateTimeTuple, !Bool, !Bool), !*env)
getCommonFileInfoC _ _
= code
{
ccall getCommonFileInfoC "I:VSIIIIIIIIIII:A"
}
// createDirectoryC returns the following error codes:
M_NoDirError :== 0
M_OtherDirError :== -1
M_DoesntExist :== -2
M_BadName :== -3
M_NotEnoughSpace :== -4
M_AlreadyExists :== -5
M_NoPermission :== -6
// END copied from Directory.icl
// return last modified time (local time) as "yyyymmddhhmmss" or "" on error
fmodificationtime :: {#Char} !*env -> (!{#Char}, !*env) | FileSystem env
fmodificationtime path env
# (result, env)
= findSingleFileC (path+++"\0") env
| result <> 0
= ("", env)
# ((_, _, lastModifiedTuple, _, _), env)
= getCommonFileInfoC False env
= (dateTimeTupleToString lastModifiedTuple, env)
dateTimeTupleToString :: DateTimeTuple -> {#Char}
dateTimeTupleToString ((year, month, day, _), (hours, minutes, seconds))
= string 4 year +++ string 2 month +++ string 2 day
+++ string 2 hours +++ string 2 minutes +++ string 2 seconds
where
string :: !Int !Int -> {#Char}
string minSize n
= pad (minSize - size s) +++ s
where
s
= toString n
pad :: Int -> {#Char}
pad n
| n > 0
= createArray n '0'
// otherwise
= ""
ensureDirectoryExists :: !{#Char} !*env -> (!Bool, !*env) | FileSystem env
// returned bool: now there is such a subfolder
ensureDirectoryExists path env
# path_c_string = path +++ "\0"
(err_code, env) = createDirectoryC path_c_string env
= (err_code==M_NoDirError || err_code==M_AlreadyExists, env)
|