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 12 years ago · 1 revisions