/
EvilBeaver
/
OneScript
Обзор
Документация
Войти
/
EvilBeaver
/
OneScript
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
v1.8.2
src/ScriptEngine/Environment/FileOpener.cs
111 строк
4 KB
Michael Rybakin
Исправлено определение BOM
21 апр 2022, 13:57
21 апр 2022, 13:57
98a5243
Код
Авторство
О чём код?
/*---------------------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using System; using System.IO; using System.Text; namespace ScriptEngine.Environment { public static class FileOpener { public static StreamReader OpenReader(string filename) { return OpenReader(filename, FileShare.ReadWrite); } public static StreamReader OpenReader(string filename, FileShare shareMode, Encoding encoding = null) { var input = new FileStream(filename, FileMode.Open, FileAccess.Read, shareMode); if (encoding == null) { var enc = AssumeEncoding(input); return new StreamReader(input, enc, true); } return new StreamReader(input, encoding); } public static StreamReader OpenReader(string filename, Encoding encoding) { return OpenReader(filename, FileShare.ReadWrite, encoding); } public static StreamReader OpenReader(Stream stream, Encoding encoding = null) { if(encoding == null) { var enc = AssumeEncoding(stream); return new StreamReader(stream, enc, true); } return new StreamReader(stream, encoding); } public static StreamWriter OpenWriter(string filename) { var utf8BOMEncoding = new UTF8Encoding(true); return new StreamWriter(filename, false, utf8BOMEncoding); } public static StreamWriter OpenWriter(string filename, Encoding encoding) { return new StreamWriter(filename, false, encoding); } public static StreamWriter OpenWriter(string filename, Encoding encoding, bool append) { return new StreamWriter(filename, append, encoding); } public static Encoding AssumeEncoding(Stream inputStream) { return AssumeEncoding(inputStream, SystemSpecificEncoding()); } public static Encoding SystemSpecificEncoding() { if(System.Environment.OSVersion.Platform == PlatformID.Unix || System.Environment.OSVersion.Platform == PlatformID.MacOSX) { return Encoding.UTF8; } else { return Encoding.Default; } } public static Encoding AssumeEncoding(Stream inputStream, Encoding fallbackEncoding) { var enc = fallbackEncoding; // *** Detect byte order mark if any - otherwise assume default byte[] buffer = new byte[4]; inputStream.Read(buffer, 0, 4); inputStream.Position = 0; if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf) enc = Encoding.UTF8; else if (buffer[0] == 0xff && buffer[1] == 0xfe && buffer[2] == 0 && buffer[3] == 0) enc = Encoding.UTF32; // UTF32LE else if (buffer[0] == 0xff && buffer[1] == 0xfe) enc = Encoding.Unicode; // UTF16LE else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff) enc = new UTF32Encoding(true, true); // UTF32BE with BOM; else if (buffer[0] == 0xfe && buffer[1] == 0xff) enc = Encoding.BigEndianUnicode; // UTF16BE else if (buffer[0] == '#' && buffer[1] == '!') { /* Если в начале файла присутствует shebang, считаем, что файл в UTF-8*/ enc = Encoding.UTF8; } return enc; } } }