2
0

FileSystem.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. namespace Lua.IO
  2. {
  3. public sealed class FileSystem : ILuaFileSystem
  4. {
  5. public static (FileMode, FileAccess access) GetFileMode(LuaFileOpenMode luaFileOpenMode)
  6. {
  7. return luaFileOpenMode switch
  8. {
  9. LuaFileOpenMode.Read => (FileMode.Open, FileAccess.Read),
  10. LuaFileOpenMode.Write => (FileMode.Create, FileAccess.Write),
  11. LuaFileOpenMode.Append => (FileMode.Append, FileAccess.Write),
  12. LuaFileOpenMode.ReadUpdate => (FileMode.Open, FileAccess.ReadWrite),
  13. LuaFileOpenMode.WriteUpdate => (FileMode.Truncate, FileAccess.ReadWrite),
  14. LuaFileOpenMode.AppendUpdate => (FileMode.Append, FileAccess.ReadWrite),
  15. _ => throw new ArgumentOutOfRangeException(nameof(luaFileOpenMode), luaFileOpenMode, null)
  16. };
  17. }
  18. public bool IsReadable(string path)
  19. {
  20. return File.Exists(path);
  21. }
  22. public ValueTask<ILuaStream> Open(string path, LuaFileOpenMode openMode, CancellationToken cancellationToken)
  23. {
  24. var (mode, access) = GetFileMode(openMode);
  25. Stream stream;
  26. if (openMode == LuaFileOpenMode.AppendUpdate)
  27. {
  28. stream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
  29. }
  30. else
  31. {
  32. stream = File.Open(path, mode, access, FileShare.ReadWrite | FileShare.Delete);
  33. }
  34. ILuaStream wrapper =
  35. new LuaStream(openMode, stream);
  36. if (openMode == LuaFileOpenMode.AppendUpdate)
  37. {
  38. wrapper.Seek(SeekOrigin.End,0);
  39. }
  40. return new(wrapper);
  41. }
  42. public ValueTask Rename(string oldName, string newName, CancellationToken cancellationToken)
  43. {
  44. if (oldName == newName) return default;
  45. if (File.Exists(newName)) File.Delete(newName);
  46. File.Move(oldName, newName);
  47. File.Delete(oldName);
  48. return default;
  49. }
  50. public ValueTask Remove(string path, CancellationToken cancellationToken)
  51. {
  52. File.Delete(path);
  53. return default;
  54. }
  55. static readonly string directorySeparator = Path.DirectorySeparatorChar.ToString();
  56. public string DirectorySeparator => directorySeparator;
  57. public string GetTempFileName()
  58. {
  59. return Path.GetTempFileName();
  60. }
  61. public ValueTask<ILuaStream> OpenTempFileStream(CancellationToken cancellationToken)
  62. {
  63. return new(new LuaStream(LuaFileOpenMode.WriteUpdate, File.Open(Path.GetTempFileName(), FileMode.Open, FileAccess.ReadWrite)));
  64. }
  65. }
  66. }