mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
214 lines
5.4 KiB
C#
214 lines
5.4 KiB
C#
using System;
|
|
using System.IO;
|
|
using Compress.Utils;
|
|
using Path = RVIO.Path;
|
|
using FileInfo = RVIO.FileInfo;
|
|
using FileStream = RVIO.FileStream;
|
|
|
|
namespace Compress.File
|
|
{
|
|
public class File : ICompress
|
|
{
|
|
private FileInfo _fileInfo;
|
|
private Stream _inStream;
|
|
private byte[] _crc;
|
|
|
|
public string ZipFilename => _fileInfo?.FullName ?? "";
|
|
|
|
public long TimeStamp => _fileInfo?.LastWriteTime ?? 0;
|
|
|
|
public ZipOpenType ZipOpen { get; private set; }
|
|
|
|
|
|
public ZipStatus ZipStatus { get; private set; }
|
|
|
|
public int LocalFilesCount()
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
public string Filename(int i)
|
|
{
|
|
return Path.GetFileName(ZipFilename);
|
|
}
|
|
|
|
public bool IsDirectory(int i)
|
|
{
|
|
return RVIO.Directory.Exists(ZipFilename);
|
|
}
|
|
|
|
public ulong UncompressedSize(int i)
|
|
{
|
|
return _fileInfo != null ? (ulong)_fileInfo.Length : 0;
|
|
}
|
|
|
|
public ulong? LocalHeader(int i)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
public ZipReturn FileStatus(int i)
|
|
{
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
public byte[] CRC32(int i)
|
|
{
|
|
return _crc;
|
|
}
|
|
|
|
public ZipReturn ZipFileCreate(string newFilename)
|
|
{
|
|
if (ZipOpen != ZipOpenType.Closed)
|
|
{
|
|
return ZipReturn.ZipFileAlreadyOpen;
|
|
}
|
|
|
|
DirUtil.CreateDirForFile(newFilename);
|
|
_fileInfo = new FileInfo(newFilename);
|
|
|
|
int errorCode = FileStream.OpenFileWrite(newFilename, out _inStream);
|
|
if (errorCode != 0)
|
|
{
|
|
ZipFileClose();
|
|
return ZipReturn.ZipErrorOpeningFile;
|
|
}
|
|
ZipOpen = ZipOpenType.OpenWrite;
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
|
|
public void ZipFileClose()
|
|
{
|
|
if (ZipOpen == ZipOpenType.Closed)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (ZipOpen == ZipOpenType.OpenRead)
|
|
{
|
|
if (_inStream != null)
|
|
{
|
|
_inStream.Close();
|
|
_inStream.Dispose();
|
|
}
|
|
ZipOpen = ZipOpenType.Closed;
|
|
return;
|
|
}
|
|
|
|
_inStream.Flush();
|
|
_inStream.Close();
|
|
_inStream.Dispose();
|
|
_fileInfo = new FileInfo(_fileInfo.FullName);
|
|
ZipOpen = ZipOpenType.Closed;
|
|
}
|
|
|
|
|
|
public ZipReturn ZipFileOpen(string newFilename, long timestamp, bool readHeaders)
|
|
{
|
|
ZipFileClose();
|
|
ZipStatus = ZipStatus.None;
|
|
_fileInfo = null;
|
|
|
|
try
|
|
{
|
|
if (!RVIO.File.Exists(newFilename))
|
|
{
|
|
ZipFileClose();
|
|
return ZipReturn.ZipErrorFileNotFound;
|
|
}
|
|
_fileInfo = new FileInfo(newFilename);
|
|
if (timestamp != -1 && _fileInfo.LastWriteTime != timestamp)
|
|
{
|
|
ZipFileClose();
|
|
return ZipReturn.ZipErrorTimeStamp;
|
|
}
|
|
int errorCode = FileStream.OpenFileRead(newFilename, out _inStream);
|
|
if (errorCode != 0)
|
|
{
|
|
ZipFileClose();
|
|
if (errorCode == 32)
|
|
{
|
|
return ZipReturn.ZipFileLocked;
|
|
}
|
|
return ZipReturn.ZipErrorOpeningFile;
|
|
}
|
|
}
|
|
catch (PathTooLongException)
|
|
{
|
|
ZipFileClose();
|
|
return ZipReturn.ZipFileNameToLong;
|
|
}
|
|
catch (IOException)
|
|
{
|
|
ZipFileClose();
|
|
return ZipReturn.ZipErrorOpeningFile;
|
|
}
|
|
ZipOpen = ZipOpenType.OpenRead;
|
|
|
|
if (!readHeaders)
|
|
{
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
|
|
//return ZipFileReadHeaders();
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
|
|
public ZipReturn ZipFileOpen(Stream inStream)
|
|
{
|
|
ZipFileClose();
|
|
ZipStatus = ZipStatus.None;
|
|
_fileInfo = null;
|
|
_inStream = inStream;
|
|
ZipOpen = ZipOpenType.OpenRead;
|
|
|
|
//return ZipFileReadHeaders();
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
|
|
|
|
public void ZipFileAddZeroLengthFile()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public ZipReturn ZipFileCloseWriteStream(byte[] crc32)
|
|
{
|
|
_crc = crc32;
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
public void ZipFileCloseFailed()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public ZipReturn ZipFileOpenReadStream(int index, out Stream stream, out ulong streamSize)
|
|
{
|
|
_inStream.Position = 0;
|
|
stream = _inStream;
|
|
streamSize = (ulong)_fileInfo.Length;
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
public ZipReturn ZipFileOpenWriteStream(bool raw, bool trrntzip, string filename, ulong uncompressedSize, ushort compressionMethod, uint? datetime, out Stream stream)
|
|
{
|
|
_inStream.Position = 0;
|
|
stream = _inStream;
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
public ZipReturn ZipFileCloseReadStream()
|
|
{
|
|
return ZipReturn.ZipGood;
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
} |