文件

Silk通过下列内置函数进行文件操作:

打开文件
打开文件采用内置函数_fun("fopen", filename, mode),第一个参数为函数名fopen,第二个filename为需要打开的文件的路径,mode为打开模式,
打开模式可以是下列值中的任意一个:
  1. r    打开一个已有的文本文件,允许读取文件。
  2. w    打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件,程序会从文件的开头写入内容。
  3. a    打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
  4. r+    打开一个文本文件,允许读写文件。
  5. w+    打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
  6. a+    打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
打开文件成功后,返回的是打开后的文件句柄。

关闭文件
关闭文件采用内置函数_fun("fclose", file),第一个参数为函数名fclose,第二个file为文件句柄。

文件大小
获取文件大小采用内置函数_fun("fsize", file),第一个参数为函数名fsize,第二个file为文件句柄,返回的是文件大小(字节数)。

读取文件
读取文件采用内置函数_fun("fread", file, size),第一个参数为函数名fread,第二个file为文件句柄,size为要读取的字节数。

写入文件
写入文件采用内置函数_fun("fwrite", file, content),第一个参数为函数名fwrite,第二个file为文件句柄,content为要需要写入的内容,
为字符串类型,字符串类型可以包含二进制数据。

定位文件
定位文件采用内置函数_fun("fseek", file, pos),第一个参数为函数名fseek,第二个file为文件句柄,pos为要定位的文件内容当中的位置。

删除文件
删除文件采用内置函数_fun("fremove", file),第一个参数为函数名fremove,第二个file为需要删除的文件名,可包含路径。

重命名文件
重命名文件采用内置函数_fun("frename", file, newfile),第一个参数为函数名frename,第二个file为需要改名的文件名,newfile为重命名后的文件名,可包含路径。

以下是操作文件的例子:
main()
{
    file=_fun("fopen","e:\\test.txt","rb"); //以二进制只读模式打开文件
    if(file)
    {
        print("Open file OK");
        size=_fun("fsize",file);
        print("file size:",size);
       
        _fun("fseek",file,0); //定位到文件的开头   
        content=_fun("fread",file,size); //读取文件所有内容
        print(content);
           
        _fun("fclose",file); //关闭文件
    }
}

CFile类
Silk安装包里有个封装了大部分文件操作函数的类CFile,方便用户的使用:
class CFile()
{
    self.file=null;
    self.size=0;
   
    func Open(filename,mode)
    {
        self.file=_fun("fopen",filename,mode);
        self.size=_fun("fsize",self.file);
        _fun("fseek",self.file,0);   
        return self.file;
    }
    func ReadAll()
    {
        if(self.file==null)
            return null;
        return _fun("fread",self.file,self.size);
    }
    func Seek(pos)
    {
        if(self.file==null)
            return null;
        _fun("fseek",self.file,pos);
    }
    func Read(size)
    {
        if(self.file==null)
            return null;
        return _fun("fread",self.file,size);
    }
    func Write(content)
    {
        if(self.file==null)
            return null;
        _fun("fwrite",self.file,content);
   
    }
    func Close()
    {
        if(self.file==null)
            return;
        _fun("fclose",self.file);
        self.file=null;
    }
   
}

使用CFile类的例子:
#include "include\file.si"
main()
{
    file=CFile();
    if(file.Open("e:\\test.txt","rb"))
    {
        content=file.ReadAll();
        print(content);
    }
    file.Close();
}