コード例 #1
0
   // 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);
}
コード例 #2
0
ファイル: file.c プロジェクト: yfang1644/DSP55X
/******************************************************************************
** 函数名称: 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;
}
コード例 #3
0
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;
	}
}
コード例 #4
0
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;
}
コード例 #5
0
   // 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);
}
コード例 #6
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);
}
コード例 #7
0
   // 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);
}
コード例 #8
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);
}
コード例 #9
0
   // 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);
}
コード例 #10
0
   // 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);
}
コード例 #11
0
   // 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);
}
コード例 #12
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);
}
コード例 #13
0
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;
}
コード例 #14
0
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;
}
コード例 #15
0
   // 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);
}
コード例 #16
0
   // 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);
}
コード例 #17
0
ファイル: file.c プロジェクト: yfang1644/DSP55X
/*********************************************************************************************************
** 函数名称: _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;
}
コード例 #18
0
ファイル: file.c プロジェクト: yfang1644/DSP55X
/******************************************************************************
** 函数名称: _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;
}