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 + -
显示快捷键?