Files access in Scol¶
There is two standard APIs to access to a file.
Only files in a partition can be opened, read, written or deleted (under condition for this last operation).
First API (classic) :¶
In this api, it needn't to open and close a file; there is no "file pointer".
The file can be loaded in the memory ; don't forget this if you want to work with a big file. If the file can be very big, you should use the second api.
How to read the content ?¶
With the Scol functions _getpack and _checkpack.
_getpack _checkpack <relative_pathname>
/*
1- we check the file (_checkpack)
2- we get the content (_getpack)
3- we display it, if the check is ok (otherwise, nil will be displayed) (_fooS)
*/
fun main ()=
_showconsole;
_fooS _getpack _checkpack "dir_1/dir_2/myfile.ext";
0;;
How to know if a file exists (and is accessible in reading) ?¶
With the Scol function _checkpack
_checkpack <relative_pathname>
fun main ()=
_showconsole;
let _checkpack "dir_1/dir_2/myfile.ext" -> result in
_fooS if (result == nil) then
"This file doesn't exist"
else
"This file already exists";
0;;
How to find a word in a file :¶
// check if the file exists
fun checkFile (pathname)=
if (nil == _checkpack pathname) then // file not found or access is forbidden
0
else // file found
1;;
// return the string content of the file
fun getContent (pathreference)=
let _getpack pathreference -> content in // content in a single string
strextr content;; // content is in a list, line by line and word by word (strextr)
// search a value from a key
fun findValue (listContent, key)=
hd switchstr listContent key;; // only the first word is useful in this case (hd)
fun mainGet ()=
let "locked/etc/version.txt" -> pathName in
let "version" -> key in
if checkFile pathName then
let _checkpack pathName -> refPathName in
let getContent refPathName -> listWords in
let findValue listWords key -> res in
if res == nil then
_fooS strcat key " not found"
else
_fooS strcatn key :: " is " :: res :: nil
else
_fooS "file not found or access is forbidden";
0;;
How to list the content of a directory ?¶
With the Scol functions _listoffiles and or _listofsubdir
_listoffiles <relative_pathname> // return a list of files _listofsubdir <relative_pathname> // return a list of sub-directories
Here is an example to list all files included in the "locked" directory :
fun listConcatenate (listA, listB)= // listA + listB
if listA == nil then
listB
else let listA -> [h nxt] in
h :: listConcatenate nxt listB;;
fun print (list)= // display the list of files, one by line
if list == nil then
0
else
(
_fooS hd list;
print tl list
);;
fun listFilesInDirectory (dir)= // return the list of files from a given directory
_listoffiles dir;;
fun listDirInDirectory (dir)= // return the list of sub directories from a directory
_listofsubdir dir;;
fun listDirectories (listDir, out)=
if listDir == nil then
out
else
(
set out = listConcatenate out listFilesInDirectory hd listDir;
set out = listConcatenate out listDirectories listDirInDirectory hd listDir out;
listDirectories tl listDir out
);;
fun mainDir ()=
let listFilesInDirectory "locked" -> rootFiles in
let listDirInDirectory "locked" -> rootSubFolder in
let listDirectories rootSubFolder rootFiles -> list in
print list;
0;;
How to write in a file ?¶
With the Scol functions _getmodifypack and _createpack, _appendpack or _storepack.
_createpack <string_content> _getmodifypack <relative_pathname>: create a file (if the file already exist, it will be destroyed) and write the string content.
Don't set the content to nil. To have an empty content, set to "".
_appendpack <string_content> _getmodifypack <relative_pathname>: append the string content to the end of file.
_storepack <string_content> <relative_pathname>: the file will be sored in the first writable partition.
_getmodifypack <relative_pathname>: check if the given path is correct (if correct, this function returns not nil).
How to get the size of a file ?¶
With the Scol functions _fileSize and _checkpack.
_fileSize _checkpack <relative_pathname>
How to separate the path name from the file name ?¶
fun getPathFile (longfile, file)=
if (longfile==nil) || (strlen longfile)==0 || (nth_char longfile ((strlen longfile)-1)) == '/
then
[longfile file]
else
getPathFile
substr longfile 0 (strlen longfile)-1
strcat
substr longfile ((strlen longfile)-1) 1
file;;
This function has been wrote by Marc Barilley.
Second API (Ansi-C) :¶
This is the same thing as in C.
_FILEOpen : open a file. Return a Scol reference
_FILEClose : close a file from its Scol reference
_FILERead : read the content from the cursor to a given length
_FILESeek : move the cursor
_FILETell : get the cursor position
_FILESize : get the size
fun main ()=
_showconsole;
let _FILEOpen _channel _checkpack "dir_1/dir_2/myfile.ext" -> pf in
let _FILESize pf -> size in
(
_FILESeek pf size/2 0;
_fooS _FILERead pf 255;
_FILEClose pf
);
0;;
Temporary files¶
The library Syspack introduces the temporary files support : http://www.scolring.org/files/doc_html/syspack_temfile.html
License : CC-BY-SA-2.0
Tutorial by iri
Updated by /
Updated by iri about 13 years ago · 1 revisions