Files
SabreTools/SabreTools.Library/External/Compress/File/File.cs
Matt Nadareski b6e77a31ef Fix build
2020-06-05 23:06:24 -07:00

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;
}
}
}