file.cpp

来自「SimpleGraphicOperatingSystem 32位图形化操作系统 」· C++ 代码 · 共 251 行

CPP
251
字号
#include <OsDef.h>//FILE_**
#include <System.h>
#include <Api.h>	//Sgos api


namespace System{

	File::File(){
		fno = -1;
		flag = mode = 0;
		status = FileStatus::Closed;
	}

	File::File(string fileName, int m){
		Open( fileName, m, 0 );
	}

	File::File( string fileName, int m, int f ){
		Open( fileName, m, f );
	}

	File::File( int i ){
		fno = i;
		flag = mode = 0;
		status = FileStatus::Open;
	}

	int File::Open( string fileName, int m ){
		return Open( fileName, m, 0 );
	}

	int File::Open( string fileName, int m, int f ){
		if( status!=FileStatus::Closed ){
			Close();
		}
		mode = m;
		flag = f;
		m=f=0;
		if( mode&FileMode::OpenDir && mode&FileMode::Write )
		{
		    //can't write directory file
		    return -1;
		}
		if( mode&FileMode::Read ) m|=FILE_READ;
		if( mode&FileMode::Write ) m|=FILE_WRITE;
		if( flag&FileFlag::Create ) f|=FILE_FLAG_CREATE;
		if( flag&FileFlag::Append ) f|=FILE_FLAG_APPEND;
		if( flag&FileFlag::Delete ) f|=FILE_FLAG_DELETE;
		int ret = (int)KOpenFile( (char*)fileName.GetData(), m, f );
		if( ret<0 ){
			return -1;
		}else{
			status = FileStatus::Open;
			fno = ret;
			return 0;
		}
	}

	bool File::SetSize( size_t newSize )
	{
        KSetFileSize( fno, newSize );
        if( Size()==newSize )
            return true;
        else
            return false;
	}

	bool File::IsDirectory()
	{
	    _FILE_STATUS stat;
	    KGetFileStatus( fno, &stat );
	    if( stat.attr & FILE_ATTR_ISDIR )
            return true;
        return false;
	}

	bool File::SeekTo( int pos )
	{
	    //从头寻址
	    return Seek( pos, FileSeek::Begin );
	}

	bool File::Seek( int pos, int rel )
	{
	    switch( rel )
	    {
	        case FileSeek::Begin:
                KSeekFile( fno, pos, SEEK_SET );
                break;
	        case FileSeek::Current:
                KSeekFile( fno, pos, SEEK_CUR );
                break;
	        case FileSeek::End:
                KSeekFile( fno, pos, SEEK_END );
                break;
	    }
	    return Pos()==pos;
	}

	size_t File::Size(){
	    _FILE_STATUS stat;
	    KGetFileStatus( fno, &stat );
		return (size_t)stat.size;
	}

	int File::Pos(){
	    _FILE_STATUS stat;
	    KGetFileStatus( fno, &stat );
		return (size_t)stat.pos;
	}

	int File::Read( char* buf, int len ){
		if( status==FileStatus::Open && mode&FileMode::Read ){
			int ret = (int)KReadFile( fno, buf, len );
			if( ret<0 )
				return -1;	//error
			else
				return ret;	//count that have read
		}
		return -1;
	}

	string File::ReadString( int len ){
		char* buf = new char[len+1];
		int ret=Read(buf,len);
		if(ret>0)
		{
			buf[ret]=0;
			return string(buf);
		}else{
			return string("");
		}
	}

	int File::WriteString( string str ){
	    int ret;
	    ret = Write( str.GetData(), str.Length() );
	    return ret;
	}

	int File::Write( const char* buf, int len ){
		if( status==FileStatus::Open && mode&FileMode::Write ){
			int ret = (int)KWriteFile( fno, buf, len );
			if( ret<0 )
				return -1;	//error
			else
				return ret;	//count that have written
		}
		return -1;
	}

	int File::Close(){
		if ( KCloseFile( fno ) ){
			fno = -1;
			status = FileStatus::Closed;
			return 0;
		}else{
			return -1;
		}
	}

	bool File::Closed(){
	    return (bool)(status&FileStatus::Closed);
	}

	File::~File(){
		if( status!=FileStatus::Closed ){
			Close();
		}
	}

	int File::Status(){
		return status;
	}

	string File::GetFileName( int type )
	{
		char name[1025];
		int ret;
		ret = KGetFileName( fno, name, 1024 , type );
		name[ret]=0;
		return string(name);
	}

	string File::ReadLine(){
	    string str("");
        int ret;
        char tmp[2]={0,0};
        while( (ret=Read( tmp, 1 ))>0 )
        {
            if( tmp[0]=='\r' || tmp[0]=='\n' )
            {
                return str;
            }
            str = str + string(tmp);
        }
        return str;
	}

	int File::WriteLine(string str){
	    int ret;
	    ret = WriteString( str + string("\r\n") );
	    return ret;
	}

    Time File::CreateTime()
    {
        Time t;
	    _FILE_STATUS stat;
	    KGetFileStatus( fno, &stat );
	    t = (void*) &stat.ctime;
		return t;
    }

    Time File::ModifiedTime()
    {
        Time t;
	    _FILE_STATUS stat;
	    KGetFileStatus( fno, &stat );
	    t = (void*) &stat.mtime;
		return t;
    }

    FileInfo* File::FindFirstFile()
    {
        SeekTo( 0 );
        return FindNextFile();
    }

    FileInfo* File::FindNextFile()
    {
        if( mode&FileMode::OpenDir )
        {
            _DIRECTORY_ENTRY entry;
            int ret;
            ret = KReadDir( fno, (void*)&entry, sizeof(entry) );
            if( ret == sizeof( entry) )
            {
                FileInfo* fi = new FileInfo;
                fi->name = string( entry.name );
                fi->attr = entry.attr;
                fi->size = entry.size;
                fi->ctime = (void*)&entry.ctime;
                fi->mtime = (void*)&entry.mtime;
                return fi;
            }
        }
        return (FileInfo*)0;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?