c# - getbytesfromfile - Eliminar marca de orden de bytes de un archivo.ReadAllBytes(byte[])
read bytes from file path c# (4)
Tengo un HTTPHandler que está leyendo en un conjunto de archivos CSS y combinándolos y luego GZipándolos. Sin embargo, algunos de los archivos CSS contienen una marca de orden de bytes (debido a un error en la combinación automática de TFS 2005) y en Firefox se está leyendo la lista de materiales como parte del contenido real, así que está arruinando mis nombres de clase, etc. fuera de los personajes de BOM? ¿Hay una manera fácil de hacer esto sin pasar manualmente por el conjunto de bytes buscando "ï» ¿"?
Otra forma, suponiendo UTF-8 a ASCII.
File.WriteAllText(filename, File.ReadAllText(filename, Encoding.UTF8), Encoding.ASCII);
var text = File.ReadAllText(args.SourceFileName);
var streamWriter = new StreamWriter(args.DestFileName, args.Append, new UTF8Encoding(false));
streamWriter.Write(text);
streamWriter.Close();
Expansión de la muestra JaredPar para recurse sobre subdirectorios:
using System.Linq;
using System.IO;
namespace BomRemover
{
/// <summary>
/// Remove UTF-8 BOM (EF BB BF) of all *.php files in current & sub-directories.
/// </summary>
class Program
{
private static void removeBoms(string filePattern, string directory)
{
foreach (string filename in Directory.GetFiles(directory, file Pattern))
{
var bytes = System.IO.File.ReadAllBytes(filename);
if(bytes.Length > 2 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF)
{
System.IO.File.WriteAllBytes(filename, bytes.Skip(3).ToArray());
}
}
foreach (string subDirectory in Directory.GetDirectories(directory))
{
removeBoms(filePattern, subDirectory);
}
}
static void Main(string[] args)
{
string filePattern = "*.php";
string startDirectory = Directory.GetCurrentDirectory();
removeBoms(filePattern, startDirectory);
}
}
}
Necesitaba esa pieza de código C # después de descubrir que la BOM UTF-8 corrompe el archivo cuando intentas hacer un archivo básico de descarga de PHP.
Ampliando el comentario de Jon con una muestra.
var name = GetFileName();
var bytes = System.IO.File.ReadAllBytes(name);
System.IO.File.WriteAllBytes(name, bytes.Skip(3).ToArray());