Cosmos/source/Cosmos.System2_Plugs/System/IO/FileImpl.cs

231 lines
7.8 KiB
C#

//#define COSMOSDEBUG
using System;
using System.Collections.Generic;
using System.IO;
using Cosmos.System;
using Cosmos.Common.Extensions;
using Cosmos.Debug.Kernel;
using Cosmos.IL2CPU.API;
using Cosmos.IL2CPU.API.Attribs;
using Cosmos.System.FileSystem;
using Cosmos.System.FileSystem.VFS;
using System.Text;
namespace Cosmos.System_Plugs.System.IO
{
// TODO A lot of these methods should be implemented using StreamReader / StreamWriter
[Plug(Target = typeof(File))]
public static class FileImpl
{
#if false
public static bool Exists(string aFile)
{
Global.mFileSystemDebugger.SendInternal("File.Exists:");
if (string.IsNullOrEmpty(aFile))
{
throw new ArgumentException("Argument is null or empty", nameof(aFile));
}
Global.mFileSystemDebugger.SendInternal("aFile =");
Global.mFileSystemDebugger.SendInternal(aFile);
return VFSManager.FileExists(aFile);
}
#endif
public static string ReadAllText(string aFile)
{
string result;
using (StreamReader streamReader = new StreamReader(aFile, Encoding.UTF8, true))
{
result = streamReader.ReadToEnd();
}
return result;
}
#if false
public static string ReadAllText(string aFile)
{
Global.mFileSystemDebugger.SendInternal("File.ReadAllText:");
if (string.IsNullOrEmpty(aFile))
{
throw new ArgumentException("Argument is null or empty", nameof(aFile));
}
Global.mFileSystemDebugger.SendInternal("aFile =");
Global.mFileSystemDebugger.SendInternal(aFile);
using (var xFS = new FileStream(aFile, FileMode.Open))
{
var xBuff = new byte[(int)xFS.Length];
var xResult = xFS.Read(xBuff, 0, xBuff.Length);
if (xResult != xBuff.Length)
{
throw new Exception("Couldn't read complete file!");
}
Global.mFileSystemDebugger.SendInternal("Bytes read");
var xResultStr = xBuff.GetUtf8String(0, (uint)xBuff.Length);
Global.mFileSystemDebugger.SendInternal("ResultString retrieved");
return xResultStr;
}
}
#endif
#if false
public static void WriteAllText(string aFile, string aText)
{
Global.mFileSystemDebugger.SendInternal("Creating stream with file " + aFile);
if (string.IsNullOrEmpty(aFile))
{
throw new ArgumentException("Argument is null or empty", nameof(aFile));
}
Global.mFileSystemDebugger.SendInternal("aFile =");
Global.mFileSystemDebugger.SendInternal(aFile);
if (string.IsNullOrEmpty(aText))
{
throw new ArgumentException("Argument is null or empty", nameof(aText));
}
Global.mFileSystemDebugger.SendInternal("aText =");
Global.mFileSystemDebugger.SendInternal(aText);
using (var xFS = new FileStream(aFile, FileMode.Create))
{
Global.mFileSystemDebugger.SendInternal("Converting " + aText + " to UFT8");
var xBuff = aText.GetUtf8Bytes(0, (uint)aText.Length);
if ((xBuff != null) && (xBuff.Length > 0))
{
Global.mFileSystemDebugger.SendInternal("xBuff.Length =");
Global.mFileSystemDebugger.SendInternal((uint)xBuff.Length);
Global.mFileSystemDebugger.SendInternal("Writing bytes");
xFS.Write(xBuff, 0, xBuff.Length);
Global.mFileSystemDebugger.SendInternal("Bytes written");
}
else
{
throw new Exception("No text data to write.");
}
}
}
public static void AppendAllText(string aFile, string aText)
{
Global.mFileSystemDebugger.SendInternal("Creating stream in Append Mode with file " + aFile);
using (var xFS = new FileStream(aFile, FileMode.Append))
{
Global.mFileSystemDebugger.SendInternal("Converting " + aText + " to UFT8");
var xBuff = aText.GetUtf8Bytes(0, (uint)aText.Length);
Global.mFileSystemDebugger.SendInternal("Writing bytes");
xFS.Write(xBuff, 0, xBuff.Length);
Global.mFileSystemDebugger.SendInternal("Bytes written");
}
}
public static string[] ReadAllLines(string aFile)
{
String text = ReadAllText(aFile);
Global.mFileSystemDebugger.SendInternal("Read contents");
Global.mFileSystemDebugger.SendInternal(text);
string[] result = text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Global.mFileSystemDebugger.SendInternal("content as array of lines:");
return result;
}
#endif
/*
* Plug needed for the usual issue that Array can not be converted in IEnumerable... it is starting
* to become annoying :-(
*/
public static void WriteAllLines(string aFile, string[] contents)
{
if (aFile == null)
{
throw new ArgumentNullException("path");
}
if (contents == null)
{
throw new ArgumentNullException("contents");
}
if (aFile.Length == 0)
{
throw new ArgumentException("Empty", "aFile");
}
Global.mFileSystemDebugger.SendInternal("Writing contents");
using (var xSW = new StreamWriter(aFile))
{
foreach (var current in contents)
xSW.WriteLine(current);
}
}
public static byte[] ReadAllBytes(string aFile)
{
Global.mFileSystemDebugger.SendInternal("In FileImpl.ReadAllText");
using (var xFS = new FileStream(aFile, FileMode.Open))
{
var xBuff = new byte[(int)xFS.Length];
var xResult = xFS.Read(xBuff, 0, xBuff.Length);
if (xResult != xBuff.Length)
{
throw new Exception("Couldn't read complete file!");
}
Global.mFileSystemDebugger.SendInternal("Bytes read");
return xBuff;
}
}
public static void WriteAllBytes(string aFile, byte[] aBytes)
{
using (var xFS = new FileStream(aFile, FileMode.Create))
{
xFS.Write(aBytes, 0, aBytes.Length);
}
}
#if false
public static void Copy(string srcFile, string destFile)
{
using (var xFS = new FileStream(srcFile, FileMode.Open))
{
var xBuff = new byte[(int)xFS.Length];
var yFS = new FileStream(destFile, FileMode.Create);
yFS.Write(xBuff, 0, xBuff.Length);
}
}
public static void Delete(string aPath)
{
string xFullPath = Path.GetFullPath(aPath);
VFSManager.DeleteFile(xFullPath);
}
public static FileStream Create(string aFile)
{
Global.mFileSystemDebugger.SendInternal("File.Create:");
if (string.IsNullOrEmpty(aFile))
{
throw new ArgumentException("Argument is null or empty", nameof(aFile));
}
var xEntry = VFSManager.CreateFile(aFile);
if (xEntry == null)
{
return null;
}
return new FileStream(aFile, FileMode.Open);
}
#endif
}
}