/** Close a specified file handle. @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the file handle to close. @retval EFI_SUCCESS The file was closed. @retval EFI_INVALID_PARAMETER The parameter "This" is NULL. **/ EFI_STATUS FileClose ( IN EFI_FILE *This ) { SEMIHOST_FCB *Fcb; if (This == NULL) { return EFI_INVALID_PARAMETER; } Fcb = SEMIHOST_FCB_FROM_THIS(This); if (!Fcb->IsRoot) { SemihostFileClose (Fcb->SemihostHandle); // // The file size might have been reduced from its actual // size on the host file system with FileSetInfo(). In // that case, the file has to be truncated. // if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) { TruncateFile (Fcb->FileName, Fcb->Info.FileSize); } FreePool (Fcb->FileName); } FreeFCB (Fcb); return EFI_SUCCESS; }
void TruncateFile(const QString & path,Uint64 size) { int fd = ::open(QFile::encodeName(path),O_RDWR | O_LARGEFILE); if (fd < 0) throw Error(i18n("Cannot open %1: %2",path,strerror(errno))); try { TruncateFile(fd,size,true); close(fd); } catch (...) { close(fd); throw; } }