/
smwwiki
/
OneScript_fork
Обзор
Документация
Войти
/
smwwiki
/
OneScript_fork
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/OneScript.Core/Commons/FileOpener.cs
110 строк
4 KB
EvilBeaver
Вливание из develop
02 май 2022, 23:14
02 май 2022, 23:14
b49ca41
Код
Авторство
О чём код?
/*---------------------------------------------------------- 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 OneScript.Commons { 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(Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX) { return Encoding.UTF8; } 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; } } }