FileSystem.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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.ReadWriteOpen => (FileMode.Open, FileAccess.ReadWrite),
  13. LuaFileOpenMode.ReadWriteCreate => (FileMode.Truncate, FileAccess.ReadWrite),
  14. LuaFileOpenMode.ReadAppend => (FileMode.Append, FileAccess.ReadWrite),
  15. _ => throw new ArgumentOutOfRangeException(nameof(luaFileOpenMode), luaFileOpenMode, null)
  16. };
  17. }
  18. public bool IsReadable(string path)
  19. {
  20. if (!File.Exists(path)) return false;
  21. try
  22. {
  23. File.Open(path, FileMode.Open, FileAccess.Read).Dispose();
  24. return true;
  25. }
  26. catch (Exception)
  27. {
  28. return false;
  29. }
  30. }
  31. ILuaIOStream Open(string path, LuaFileOpenMode luaMode, LuaFileContentType contentType)
  32. {
  33. var (mode, access) = GetFileMode(luaMode);
  34. Stream stream;
  35. if (luaMode == LuaFileOpenMode.ReadAppend)
  36. {
  37. stream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
  38. }
  39. else
  40. {
  41. stream = File.Open(path, mode, access, FileShare.ReadWrite | FileShare.Delete);
  42. }
  43. ILuaIOStream wrapper = contentType == LuaFileContentType.Binary
  44. ? new BinaryLuaIOStream(luaMode, stream)
  45. : new TextLuaIOStream(luaMode, stream);
  46. if (luaMode == LuaFileOpenMode.ReadAppend)
  47. {
  48. wrapper.Seek(0, SeekOrigin.End);
  49. }
  50. return wrapper;
  51. }
  52. public ILuaIOStream Open(string path, LuaFileMode mode)
  53. {
  54. if (mode is LuaFileMode.ReadBinaryOrText)
  55. {
  56. return new LuaChunkStream(File.OpenRead(path));
  57. }
  58. var openMode = mode.GetOpenMode();
  59. var contentType = mode.GetContentType();
  60. return Open(path, openMode, contentType);
  61. }
  62. public ILuaIOStream Open(string path, string mode)
  63. {
  64. var flags = LuaFileModeExtensions.ParseModeString(mode);
  65. return Open(path, flags);
  66. }
  67. public void Rename(string oldName, string newName)
  68. {
  69. if (oldName == newName) return;
  70. File.Move(oldName, newName);
  71. File.Delete(oldName);
  72. }
  73. public void Remove(string path)
  74. {
  75. File.Delete(path);
  76. }
  77. static readonly string directorySeparator = Path.DirectorySeparatorChar.ToString();
  78. public string DirectorySeparator => directorySeparator;
  79. public string GetTempFileName()
  80. {
  81. return Path.GetTempFileName();
  82. }
  83. public ILuaIOStream OpenTempFileStream()
  84. {
  85. return new TextLuaIOStream(LuaFileOpenMode.ReadAppend, File.Open(Path.GetTempFileName(), FileMode.Open, FileAccess.ReadWrite));
  86. }
  87. }
  88. }