// PfmFormatterDispatch::MoveReplace void CCALL Volume::MoveReplace( PfmMarshallerMoveReplaceOp* op, void* formatterUse) { int64_t sourceOpenId = op->SourceOpenId(); int64_t sourceParentFileId = op->SourceParentFileId(); const PfmNamePart* sourceEndName = op->SourceEndName(); int64_t targetOpenId = op->TargetOpenId(); int64_t targetParentFileId = op->TargetParentFileId(); const PfmNamePart* targetEndName = op->TargetEndName(); uint8_t/*bool*/ deleteSource = op->DeleteSource(); int64_t writeTime = op->WriteTime(); int perr; File* file; File* target; perr = FindOpenFile( sourceOpenId, &file); if (!perr) { perr = FindOpenFile( targetOpenId, &target); if (!perr) { if (target == &root) { // Can't replace root. perr = pfmErrorAccessDenied; } else if (!target->name) { perr = pfmErrorDeleted; } else if (file->sibPrev && !deleteSource) { // Links are not supported. perr = pfmErrorInvalid; } else if (file == target) { perr = pfmErrorInvalid; } else { perr = file->Move( target->parent, target->sibPrev, target->name, writeTime); if (!perr) { target->Delete( writeTime, false/*leaveChildren*/); } } } } op->Complete( perr); }
/****************************************************************************** ** 函数名称: RemoveFile ** 功能描述: 删除文件 ** ** 输 入: DirFileName:用户使用的文件名 ** ** 输 出: RETURN_OK:成功 ** 其它参考fat.h中关于返回值的说明 ** 全局变量: 无 ** 调用模块: _GetFDTInfo,FindFDTInfo,FATDelClusChain,DelFDT ** *****************************************************************************/ Uint8 RemoveFile(Int8 *DirFileName) { Uint32 ClusIndex, ClusIndex1; Uint8 Rt; Int8 DirName[12]; FDT temp; DirFileName = FsStrCopy(DirFileName); ClusIndex = _GetFDTInfo(DirName, DirFileName); Rt = PATH_NOT_FIND; if (ClusIndex != BAD_CLUS) { Rt = FindFDTInfo(&temp, ClusIndex, DirName); if (Rt == RETURN_OK) { Rt = NOT_FIND_FILE; if ((temp.Attr & ATTR_DIRECTORY) == 0) /* 是文件才删除 */ { Rt = FILE_LOCK; if (FindOpenFile(ClusIndex, DirName, FILE_FLAGS_READ|FILE_FLAGS_WRITE) == Not_Open_FILE) { /* 文件没有打开才删除 */ ClusIndex1 = temp.FstClusLO + ((Uint32)temp.FstClusHI << 16); FATDelClusChain(ClusIndex1); Rt = DelFDT(ClusIndex, DirName); } } } } return Rt; }
void FNetworkFileServerClientConnection::ProcessReadFile( FArchive& In, FArchive& Out ) { // Get Handle ID uint64 HandleId = 0; In << HandleId; int64 BytesToRead = 0; In << BytesToRead; int64 BytesRead = 0; IFileHandle* File = FindOpenFile(HandleId); if (File) { uint8* Dest = (uint8*)FMemory::Malloc(BytesToRead); if (File->Read(Dest, BytesToRead)) { BytesRead = BytesToRead; Out << BytesRead; Out.Serialize(Dest, BytesRead); } else { Out << BytesRead; } FMemory::Free(Dest); } else { Out << BytesRead; } }
void FNetworkFileServerClientConnection::ProcessWriteFile( FArchive& In, FArchive& Out ) { // Get Handle ID uint64 HandleId = 0; In << HandleId; int64 BytesWritten = 0; IFileHandle* File = FindOpenFile(HandleId); if (File) { int64 BytesToWrite = 0; In << BytesToWrite; uint8* Source = (uint8*)FMemory::Malloc(BytesToWrite); In.Serialize(Source, BytesToWrite); if (File->Write(Source, BytesToWrite)) { BytesWritten = BytesToWrite; } FMemory::Free(Source); } Out << BytesWritten; }
// PfmFormatterDispatch::FlushFile void CCALL Volume::FlushFile( PfmMarshallerFlushFileOp* op, void* formatterUse) { int64_t openId = op->OpenId(); uint8_t flushFlags = op->FlushFlags(); uint8_t fileFlags = op->FileFlags(); uint8_t color = op->FileFlags(); int64_t createTime = op->CreateTime(); int64_t accessTime = op->AccessTime(); int64_t writeTime = op->WriteTime(); int64_t changeTime = op->ChangeTime(); int perr; PfmOpenAttribs openAttribs = zeroOpenAttribs; File* file; perr = FindOpenFile( openId, &file); if (!perr) { file->Flush( fileFlags, createTime, accessTime, writeTime, changeTime); if (flushFlags&pfmFlushFlagOpen) { file->Opened( &openAttribs); } } op->Complete( perr, &openAttribs, 0); }
// PfmFormatterDispatch::Delete void CCALL Volume::Delete( PfmMarshallerDeleteOp* op, void* formatterUse) { int64_t openId = op->OpenId(); int64_t parentFileId = op->ParentFileId(); const PfmNamePart* endName = op->EndName(); int64_t writeTime = op->WriteTime(); int perr; File* file; perr = FindOpenFile( openId, &file); if (!perr) { if (file == &root) { // Can't delete root. perr = pfmErrorAccessDenied; } else if (!file->name) { // Already deleted. } else if (file->fileType == pfmFileTypeFolder && file->data.folder.firstChild) { // Don't allow non empty folder to be deleted perr = pfmErrorNotEmpty; } else { file->Delete( writeTime, false/*leaveChildren*/); } } op->Complete( perr); }
// PfmFormatterDispatch::Move void CCALL Volume::Move( PfmMarshallerMoveOp* op, void* formatterUse) { int64_t sourceOpenId = op->SourceOpenId(); int64_t sourceParentFileId = op->SourceParentFileId(); const PfmNamePart* sourceEndName = op->SourceEndName(); const PfmNamePart* targetNameParts = op->TargetNameParts(); size_t targetNamePartCount = op->TargetNamePartCount(); bool deleteSource = !!op->DeleteSource(); int64_t writeTime = op->WriteTime(); int8_t existingAccessLevel = op->ExistingAccessLevel(); int64_t newExistingOpenId = op->NewExistingOpenId(); int perr; bool existed = false; PfmOpenAttribs openAttribs = zeroOpenAttribs; int64_t parentFileId = 0; const wchar_t* endName = 0; File* file; File* target; File* parent; File** sibPrev; perr = FindOpenFile( sourceOpenId, &file); if (!perr) { perr = FindFile( targetNameParts, targetNamePartCount, &target, &parent, &sibPrev); if (!perr) { // Watch for and allow case change rename. ("FILE.TXT" -> "File.txt") if (target && (!targetNamePartCount || target != file)) { existed = true; target->Open( newExistingOpenId, &openAttribs, &parentFileId, &endName); } else if (file->sibPrev && !deleteSource) { // Links are not supported. perr = pfmErrorInvalid; } else { // Target name must have 1 or more parts or would have found root. ASSERT( targetNamePartCount && parent && sibPrev); perr = file->Move( parent, sibPrev, targetNameParts[ targetNamePartCount-1].name, writeTime); if (!perr) { file->Open( sourceOpenId, &openAttribs, &parentFileId, &endName); } } } } op->Complete( perr, existed, &openAttribs, parentFileId, endName, 0, 0, 0, 0); }
// PfmFormatterDispatch::ListEnd void CCALL Volume::ListEnd( PfmMarshallerListEndOp* op, void* formatterUse) { int64_t openId = op->OpenId(); int64_t listId = op->ListId(); int perr; File* file; perr = FindOpenFile( openId, &file); if (!perr) { perr = file->ListEnd( listId); } op->Complete( perr); }
// PfmFormatterDispatch::SetSize void CCALL Volume::SetSize( PfmMarshallerSetSizeOp* op, void* formatterUse) { int64_t openId = op->OpenId(); uint64_t fileSize = op->FileSize(); int perr; File* file; perr = FindOpenFile( openId, &file); if (!perr) { perr = file->SetSize( fileSize); } op->Complete( perr); }
// PfmFormatterDispatch::Close void CCALL Volume::Close( PfmMarshallerCloseOp* op, void* formatterUse) { int64_t openId = op->OpenId(); int64_t openSequence = op->OpenSequence(); int perr; File* file; perr = FindOpenFile( openId, &file); if (!perr) { file->Close( openSequence); } op->Complete( perr); }
// PfmFormatterDispatch::Access void CCALL Volume::Access( PfmMarshallerAccessOp* op, void* formatterUse) { int64_t openId = op->OpenId(); int perr = 0; PfmOpenAttribs openAttribs = zeroOpenAttribs; File* file; perr = FindOpenFile( openId, &file); if (!perr) { file->Opened( &openAttribs); } op->Complete( perr, &openAttribs, 0); }
// PfmFormatterDispatch::Write void CCALL Volume::Write( PfmMarshallerWriteOp* op, void* formatterUse) { int64_t openId = op->OpenId(); uint64_t fileOffset = op->FileOffset(); const void* data = op->Data(); size_t requestedSize = op->RequestedSize(); int perr; size_t actualSize = 0; File* file; perr = FindOpenFile( openId, &file); if (!perr) { perr = file->Write( fileOffset, data, requestedSize, &actualSize); } op->Complete( perr, actualSize); }
void FNetworkFileServerClientConnection::ProcessCloseFile( FArchive& In, FArchive& Out ) { // Get Handle ID uint64 HandleId = 0; In << HandleId; uint32 Closed = 0; IFileHandle* File = FindOpenFile(HandleId); if (File) { Closed = 1; OpenFiles.Remove(HandleId); delete File; } Out << Closed; }
void FNetworkFileServerClientConnection::ProcessSeekFile( FArchive& In, FArchive& Out ) { // Get Handle ID uint64 HandleId = 0; In << HandleId; int64 NewPosition; In << NewPosition; int64 SetPosition = -1; IFileHandle* File = FindOpenFile(HandleId); if (File && File->Seek(NewPosition)) { SetPosition = File->Tell(); } Out << SetPosition; }
// PfmFormatterDispatch::List void CCALL Volume::List( PfmMarshallerListOp* op, void* formatterUse) { int64_t openId = op->OpenId(); int64_t listId = op->ListId(); int perr = 0; bool noMore = false; File* file; FileList* list; perr = FindOpenFile( openId, &file); if (!perr) { perr = file->ListFactory( listId, &list); if (!perr) { list->Iterate( op, &noMore); } } op->Complete( perr, noMore); }
// PfmFormatterDispatch::Replace void CCALL Volume::Replace( PfmMarshallerReplaceOp* op, void* formatterUse) { int64_t targetOpenId = op->TargetOpenId(); int64_t targetParentFileId = op->TargetParentFileId(); const PfmNamePart* targetEndName = op->TargetEndName(); uint8_t createFileFlags = op->CreateFileFlags(); int64_t writeTime = op->WriteTime(); int64_t newCreateOpenId = op->NewCreateOpenId(); int perr; PfmOpenAttribs openAttribs = zeroOpenAttribs; File* target; File* file; perr = FindOpenFile( targetOpenId, &target); if (!perr) { if (target == &root) { // Can't replace root. perr = pfmErrorAccessDenied; } else if (!target->name) { perr = pfmErrorDeleted; } else { perr = FileFactory( target->parent, target->sibPrev, target->name, target->fileType, createFileFlags, writeTime, &file); if (!perr) { target->Delete( writeTime, false/*leaveChildren*/); file->Open( newCreateOpenId, &openAttribs, 0, 0); } } } op->Complete( perr, &openAttribs, 0); }
/********************************************************************************************************* ** 函数名称: _FileOpenRW ** 功能描述: 只读写方式打开文件,内部使用 ** ** 输 入: DirFileName:用户使用的文件名 ** ** 输 出: 文件句柄,Not_Open_FILE为不能打开 ** ** 全局变量: 无 ** 调用模块: _FileOpenR,_FileOpenW ** ********************************************************************************************************/ HANDLE _FileOpenRW(char *DirFileName) { HANDLE Rt; Rt = _FileOpenR(DirFileName); if (Rt == Not_Open_FILE) { Rt = _FileOpenW(DirFileName); } else { if (FindOpenFile(FileInfo[Rt].DirClus, FileInfo[Rt].Name, FILE_FLAGS_WRITE) == Not_Open_FILE) { FileInfo[Rt].Flags = (FILE_FLAGS_WRITE | FILE_FLAGS_READ); } else { FileInfo[Rt].Flags = 0; Rt = Not_Open_FILE; } } return Rt; }
/****************************************************************************** ** 函数名称: _FileOpenW ** 功能描述: 只写方式打开文件,内部使用 ** ** 输 入: DirFileName:用户使用的文件名 ** ** 输 出: 文件句柄,Not_Open_FILE为不能打开 ** ** 全局变量: FileInfo ** 调用模块: _GetFDTInfo,FindFDTInfo ** *****************************************************************************/ HANDLE _FileOpenW(Int8 *DirFileName) { MY_FILE *fp; FDT temp; HANDLE Rt; Uint8 i; SYS_TIME CurTime,CrtTime; // 保存当前时间日期 /* 查找空闲文件登记项 */ for (Rt = 0; FileInfo[Rt].Flags; Rt++) { if(Rt >= MAX_OPEN_FILES) return Not_Open_FILE; } fp = FileInfo + Rt; // 指向获得的空闲登记项 /* 获取目录开始簇号和文件名 */ fp->DirClus = _GetFDTInfo(fp->Name, DirFileName); // 获取该文件的FDT项的首簇号,及文件名 if (fp->DirClus < BAD_CLUS) { /* 文件已经以读写方式打开,不能再次以读写方式打开 */ if (FindOpenFile(fp->DirClus, fp->Name, FILE_FLAGS_WRITE) == Not_Open_FILE) { if(FS_GetDateTime(&CurTime) != RETURN_OK) // 获取当前系统时间 { return GET_TIME_ERR; } if (FindFDTInfo(&temp, fp->DirClus, fp->Name) == RETURN_OK) { if ((temp.Attr & ATTR_DIRECTORY) != 0) { return Not_Open_FILE; // 如果该文件为目录,则不能删除 } CrtTime.date = temp.CrtDate; // 保存文件建立时间 CrtTime.time = temp.CrtTime; CrtTime.msec = temp.CrtTimeTenth; if (RemoveFile(DirFileName) != RETURN_OK) /* 删除文件 */ { return Not_Open_FILE; } } else { CrtTime = CurTime; // 设置文件建立时间为当前时间 } /* 创建文件 */ for (i = 0; i < 11; i++) // 创建将要生成文件的FDT项 { temp.Name[i] = fp->Name[i]; // 复制名字 } temp.Attr = 0; // 特性为0 temp.FileSize = 0; temp.NTRes = 0; /*-------在此加入创建时间的程序---------*/ temp.CrtTimeTenth = CrtTime.msec; temp.CrtTime = CrtTime.time; temp.CrtDate = CrtTime.date; temp.LstAccDate = CurTime.date; temp.WrtTime = CurTime.time + 1; temp.WrtDate = CurTime.date; /*--------------------------------------*/ temp.FstClusLO = 0; temp.FstClusHI = 0; if (AddFDT(fp->DirClus, &temp) == RETURN_OK) /* 增加文件 */ { /* 设置文件信息 */ fp->Flags = FILE_FLAGS_WRITE; fp->FileSize = 0; fp->FstClus = 0; fp->Clus = 0; fp->Offset = 0; return Rt; } // if(Add..) } // if(Find..) } // if(fp..) return Not_Open_FILE; }