将Windows文件格式转换为Linux格式

时间:2017-10-25 07:31:29

标签: c# linux azure azure-functions

我正在使用Linux机器进行开发,然后将我的脚本文件部署到Azure机器应用程序,这是一台Windows机器。

然后我将shell脚本文件从Azure功能应用程序复制到wasb。

在Azure HDI群集上的Edge节点中运行shell脚本时出现以下错误

$'\r': command not found

我的脚本文件未正确执行。

在C#Azure函数中转换dos2unix选项的最佳方法是什么?

5 个答案:

答案 0 :(得分:2)

您不必做任何特别的事情来阅读包含Unix风格换行符(\n)而不是\r\n的文件。 .NET IO方法将两者视为换行符。

你可以写

var lines-File.ReadAllLines("myUnixText.txt");

using(var reader=File.OpenText("myUnixText.txt"))
{
    string line;
    while( (line=reader.ReadLine()) !=null)
    {
        // Do something
    }
}

读取行结尾是\r还是\n

证明:

var numbers = new[]{1,2,3,4,5,6};
var lines=String.Join("\n",numbers);
File.WriteAllText("myUnixText.txt",lines);

var newLines=File.ReadAllLines("myUnixText.txt");

Debug.Assert(newLines.Length==6);

即使只写了单个字符串,File.ReadAllLines也会从文件中读取6行

答案 1 :(得分:1)

您可以将文件上传到Linux并更改文件格式。

dos2unix <filename>

另一个简单的解决方案是,如果你安装Notepad ++,它支持自动转换格式为Unix(LF)。

enter image description here

答案 2 :(得分:1)

在将文件从Azure功能复制到WASB之前,我正在调用Dos2Unix(filePath)方法。

通话方式: -

Dos2Unix(D:\home\site\repository\sample.sh);

以下方法实际上适用于C#Azure函数。

private void Dos2Unix(string fileName)
{
    const byte CR = 0x0D;
    const byte LF = 0x0A;
    byte[] data = File.ReadAllBytes(fileName);
    using (FileStream fileStream = File.OpenWrite(fileName))
    {
        BinaryWriter bw = new BinaryWriter(fileStream);
        int position = 0;
        int index = 0;
        do
        {
            index = Array.IndexOf<byte>(data, CR, position);
            if ((index >= 0) && (data[index + 1] == LF))
            {
                // Write before the CR
                bw.Write(data, position, index - position);
                // from LF
                position = index + 1;
            }
        }
        while (index >= 0);
        bw.Write(data, position, data.Length - position);
        fileStream.SetLength(fileStream.Position);
    }
}

更新1: -

这是我的代码,用于将文件(*。sh,* .jar,* .img等)上传到blob存储。

public bool UploadBlobFile(string containerName, string blobName, string filePath)
{

    try{
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);
        CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
        // convert dos2unix format
        Dos2Unix(filePath);
        using (var fileStream = System.IO.File.OpenRead(filePath))
        {
            blob.UploadFromStream(fileStream);
        }
        return true;
    } catch (Exception e) {
        log.Info("Exception: " + e);
        return false;
    }
}

答案 3 :(得分:0)

您似乎有Windows样式行结尾(\ r \ n) - 您需要将它们更改为unix样式(\ n)。

参考:'\r': command not foundConvert DOS line endings to Linux line endings in vim

答案 4 :(得分:0)

sourceforge中有一个工具可以执行此操作。 最近已经实现了很好的运行。