/// <summary> /// 写入指定文件。 /// </summary> /// <param name="name">要写入的文件名称。</param> /// <param name="buffer">存储写入文件内容的二进制流。</param> /// <param name="startIndex">存储写入文件内容的二进制流的起始位置。</param> /// <param name="length">存储写入文件内容的二进制流的长度。</param> /// <returns>是否写入指定文件成功。</returns> public bool WriteFile(string name, byte[] buffer, int startIndex, int length) { if (m_Access != FileSystemAccess.Write && m_Access != FileSystemAccess.ReadWrite) { throw new Exception("File system is not writable."); } if (string.IsNullOrEmpty(name)) { throw new Exception("Name is invalid."); } if (name.Length > byte.MaxValue) { throw new Exception(Utility.Text.Format("Name '{0}' is too long.", name)); } if (buffer == null) { throw new Exception("Buffer is invalid."); } if (startIndex < 0 || length < 0 || startIndex + length > buffer.Length) { throw new Exception("Start index or length is invalid."); } bool hasFile = false; int oldBlockIndex = -1; if (m_FileDatas.TryGetValue(name, out oldBlockIndex)) { hasFile = true; } if (!hasFile && m_FileDatas.Count >= m_HeaderData.MaxFileCount) { return(false); } int blockIndex = AllocBlock(length); if (blockIndex < 0) { return(false); } if (length > 0) { m_Stream.Position = GetClusterOffset(m_BlockDatas[blockIndex].ClusterIndex); m_Stream.Write(buffer, startIndex, length); } ProcessWriteFile(name, hasFile, oldBlockIndex, blockIndex, length); m_Stream.Flush(); return(true); }
/// <summary> /// 创建文件系统。 /// </summary> /// <param name="fullPath">要创建的文件系统的完整路径。</param> /// <param name="access">要创建的文件系统的访问方式。</param> /// <param name="stream">要创建的文件系统的文件系统流。</param> /// <param name="maxFileCount">要创建的文件系统的最大文件数量。</param> /// <param name="maxBlockCount">要创建的文件系统的最大块数据数量。</param> /// <returns>创建的文件系统。</returns> public static FileSystem Create(string fullPath, FileSystemAccess access, FileSystemStream stream, int maxFileCount, int maxBlockCount) { if (maxFileCount <= 0) { throw new Exception("Max file count is invalid."); } if (maxBlockCount <= 0) { throw new Exception("Max block count is invalid."); } if (maxFileCount > maxBlockCount) { throw new Exception("Max file count can not larger than max block count."); } FileSystem fileSystem = new FileSystem(fullPath, access, stream); fileSystem.m_HeaderData = new HeaderData(maxFileCount, maxBlockCount); CalcOffsets(fileSystem); Utility.Marshal.StructureToBytes(fileSystem.m_HeaderData, HeaderDataSize, s_CachedBytes); try { stream.Write(s_CachedBytes, 0, HeaderDataSize); stream.SetLength(fileSystem.m_FileDataOffset); return(fileSystem); } catch { fileSystem.Shutdown(); return(null); } }