MSBuild Concat任务仅处理ASCII文件

MSBuild Concat任务仅处理ASCII文件,msbuild,Msbuild,我使用MSBuild副本,然后使用Concat连接多个SQL文件。一些SQL文件采用其他格式(在记事本中打开),但在Concat访问这些文件后,生成的文件中到处都是奇怪的字符 有人能帮我吗,以前有人经历过吗?如何将所有SQL文件转换为ascii,或使Concat任务正常工作?我通过编写实用程序C#类解决了这个问题。它不是为处理异常而设计的,它们由调用类处理或在控制台中未处理 它将文件转换为ASCII,删除所有无效字符并重写文件 我花了一段时间想知道为什么会出现访问被拒绝的问题,请确保在转换之前签

我使用MSBuild副本,然后使用Concat连接多个SQL文件。一些SQL文件采用其他格式(在记事本中打开),但在Concat访问这些文件后,生成的文件中到处都是奇怪的字符


有人能帮我吗,以前有人经历过吗?如何将所有SQL文件转换为ascii,或使Concat任务正常工作?

我通过编写实用程序C#类解决了这个问题。它不是为处理异常而设计的,它们由调用类处理或在控制台中未处理

它将文件转换为ASCII,删除所有无效字符并重写文件

我花了一段时间想知道为什么会出现访问被拒绝的问题,请确保在转换之前签出了所有要转换的文件

如果您感兴趣,请点击这里:

using System;
using System.IO;
using System.Text;

/// <summary>
/// Manages encoding of text files.
/// </summary>
public class TextFileEncoding
{
    /// <summary>
    /// Main command-line entry.
    /// </summary>
    /// <param name="args"></param>
    public static void Main(string[] args)
    {
        if (args.Length > 0)
        {
            string argParam = args[0].ToString().Trim().ToLower();
            switch (argParam)
            {
                // Return encoding for a file.
                case "get":
                    Encoding enc = GetEncoding(args[1].ToString());
                    Console.WriteLine(enc.EncodingName);
                    break;

                // convert encoding for a path with a given pattern to ASCII.
                case "toascii":
                    int count = ConvertToAscii(args[1].ToString(), args.Length == 3 ? args[2] : "*.*");
                    Console.WriteLine("Successfully converted " + count + " files.");
                    break;
                default:
                    Console.WriteLine("Invalid parameter. Expected get or toascii");
                    break;
            }
        }
        else
        {
            Console.WriteLine("Missing filename parameter.\nFormat: TextFileEncoding.exe [get|toascii] <TextFile> <Path> <Pattern>");
        }
    }

    /// <summary>
    /// Returns the encoding of the filename at the specified path.
    /// </summary>
    /// <param name="filename"></param>
    /// <returns></returns>
    public static Encoding GetEncoding(string filename)
    {
        StreamReader fileStream = new StreamReader(filename, true);
        return GetEncoding(fileStream);
    }

    /// <summary>
    /// Returns the encoding of the file stream.
    /// </summary>
    /// <param name="fileStream"></param>
    /// <returns></returns>
    public static Encoding GetEncoding(StreamReader fileStream)
    {
        return fileStream.CurrentEncoding;
    }

    /// <summary>
    /// Converts all files to ascii encoding.
    /// </summary>
    /// <param name="path"></param>
    /// <returns></returns>
    public static int ConvertToAscii(string path, string pattern)
    {
        DirectoryInfo pathInfo = new DirectoryInfo(path);
        int count = 0;

        // Get files in directory, recursively.
        FileInfo[] files = pathInfo.GetFiles(pattern, SearchOption.AllDirectories);

        foreach (FileInfo file in files)
        {
            // Encode to ASCII.
            if (EncodeAscii(file))
            {
                count++;
            }
        }

        return count;
    }

    /// <summary>
    /// Converts file to ascii.
    /// </summary>
    /// <param name="file"></param>
    /// <returns></returns>
    private static bool EncodeAscii(FileInfo file)
    {
        ASCIIEncoding encoder = new ASCIIEncoding();

        // Get content of file as string.
        string content = File.ReadAllText(file.FullName);

        // Convert to an ASCII byte array.
        byte[] asciiString = encoder.GetBytes(content);

        // Convert to string, so all unknown characters get removed.
        string cleanString = encoder.GetString(asciiString);

        // Convert back to byte array for writing to file.
        byte[] cleanBytes = encoder.GetBytes(cleanString);

        // Delete and rewrite file as ASCII.
        file.Delete();
        File.WriteAllBytes(file.FullName, cleanBytes);

        return true;
    }
}
使用系统;
使用System.IO;
使用系统文本;
/// 
///管理文本文件的编码。
/// 
公共类TextFileEncoding
{
/// 
///主命令行条目。
/// 
/// 
公共静态void Main(字符串[]args)
{
如果(args.Length>0)
{
字符串argParam=args[0].ToString().Trim().ToLower();
开关(argParam)
{
//返回文件的编码。
案例“get”:
Encoding enc=GetEncoding(args[1].ToString());
Console.WriteLine(enc.EncodingName);
打破
//将具有给定模式的路径的编码转换为ASCII。
“toascii”案:
int count=ConvertToAscii(args[1].ToString(),args.Length==3?args[2]:“*”);
WriteLine(“已成功转换”+计数+“文件”);
打破
违约:
Console.WriteLine(“无效参数。应为get或toascii”);
打破
}
}
其他的
{
WriteLine(“缺少文件名参数。\n格式:TextFileEncoding.exe[get | toascii]”;
}
}
/// 
///返回指定路径处文件名的编码。
/// 
/// 
/// 
公共静态编码GetEncoding(字符串文件名)
{
StreamReader fileStream=新的StreamReader(文件名,true);
返回GetEncoding(fileStream);
}
/// 
///返回文件流的编码。
/// 
/// 
/// 
公共静态编码GetEncoding(StreamReader文件流)
{
返回fileStream.CurrentEncoding;
}
/// 
///将所有文件转换为ascii编码。
/// 
/// 
/// 
公共静态int ConvertToAscii(字符串路径、字符串模式)
{
DirectoryInfo pathInfo=新的DirectoryInfo(路径);
整数计数=0;
//递归地获取目录中的文件。
FileInfo[]files=pathInfo.GetFiles(模式,SearchOption.AllDirectories);
foreach(文件中的文件信息文件)
{
//编码为ASCII码。
if(编码ASCII(文件))
{
计数++;
}
}
返回计数;
}
/// 
///将文件转换为ascii。
/// 
/// 
/// 
专用静态布尔编码ASCII(文件信息文件)
{
ascienceoding编码器=新的ascienceoding();
//以字符串形式获取文件的内容。
字符串内容=File.ReadAllText(File.FullName);
//转换为ASCII字节数组。
字节[]ascistring=encoder.GetBytes(内容);
//转换为字符串,以便删除所有未知字符。
string cleanString=encoder.GetString(ascistring);
//转换回字节数组以写入文件。
字节[]cleanBytes=编码器.GetBytes(cleanString);
//删除并将文件重写为ASCII。
Delete();
File.writealBytes(File.FullName,cleanBytes);
返回true;
}
}