Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Конец строки в Unix формате


Автор: sadisasha 8.4.2013, 17:43
Суть такова, изначально в файле конец строк записан в формате Unix, после выполнения кода конец строк записывается в форме Windows (об этом я узнал открыв файл блокнотом Notepad++). Подскажите как файл сохранить так чтобы конец строки был как в изначальном виде.
Код

var lines = File.ReadAllLines(pathFileText);
for (var i = 0; i < lines.Lenght)
      lines[i] = Replace(@"\r","");
File.WriteAllLines(pathFileText, lines, Encoding.ASCII);

Автор: SKrivosein 8.4.2013, 21:20
Попробуй так
Код

foreach (var item in lines)
            {
                item.Replace(Environment.NewLine, "\n");
            }

Автор: sadisasha 8.4.2013, 21:38
Да нет, это одно и тоже.  У меня в файле 13 строк размер файла 541 байт, в notepad++ есть такая штука (преобразовать в Unix формат), после этого преобразования получается 528 байт то есть убирается 13 байт(13 концов строк), а вот "\n" это как раз конец строки в Windows формате. Получается что Replace ни чего не меняет.

Автор: SKrivosein 8.4.2013, 21:58
\n - это конец строки в UNIX
\n\r - Windows
\r - некоторые версии MacOS
http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx

lines[i] = Replace(@"\r","");
Я вот не пойму откуда в этой строке взялся метод Replace? И @"\r" читает дословно а не как ескэйп сиквенс, по моему должно быть "\r".

Автор: sadisasha 8.4.2013, 22:58
Вроде как должно быть просто найти "\r\n" и оставить "\n", но вот при сохранении размер не меняется то есть все остается  по старому. Может быть метод WriteAllLines сам добавляет конец строки в формате windows.

Автор: SKrivosein 8.4.2013, 23:33
Да текстовые методы Write сами придают "\r\n".
Не знаю что у тебя там по коду, но вот такое будет работать
Код

    var lines = File.ReadAllLines(@"test.txt");

    using (FileStream safe_file = new FileStream(@"test1.txt", FileMode.Create))
    {
           foreach (var item in lines)
           {
                  var bites = Encoding.ASCII.GetBytes(item + "\n");
                  safe_file.Write(bites, 0, bites.Length);
           }
    }

Автор: Machaon 8.4.2013, 23:35
Попробуй так :

Код

string pathFileText = @"C:\test.txt"; //Путь до файла
            StreamReader ReadText = new StreamReader(pathFileText); //Открываешь поток и записываешь в него файл
            string MyText = ReadText.ReadToEnd(); //Читаешь поток в текстовую переменную
            ReadText.Close(); //Закрываешь поток чтения
            //
            //Тут используешь MyText где тебе нужно
            //
            StreamWriter WriteText = new StreamWriter(pathFileText, false, new UTF8Encoding(false)); //Открываешь поток, кодировка UTF8 без BOM
            WriteText.Write(MyText); //Записываешь в поток текст
            WriteText.Close();//Закрываешь поток записи


http://ru.wikipedia.org/wiki/Byte_order_mark

Должно все работать.
    

Автор: sadisasha 9.4.2013, 00:07
SKrivosein, спасибо помог разобраться с моей замарочкой.
Код

        private static void WinToUnix(string sourceFile, string distFile)
        {
            var lines = File.ReadAllLines(sourceFile);

            using (var safeFile = new FileStream(distFile, FileMode.Create))
            {
                foreach (var bites in lines.Select(item => Encoding.ASCII.GetBytes(item + "\n")))
                {
                    safeFile.Write(bites, 0, bites.Length);
                }
            }
        }

Вот я подправил твой метод, может кому пригодится.
Machaon, у Вас метод сохраняет текст в кодировке UTF8 без BOM, метод Write все равно приписывает конец строки в формате Windows. И Вас спасибо что откликнулись.

Тему можно закрывать.

Автор: diadiavova 9.4.2013, 00:09
Цитата(SKrivosein @  9.4.2013,  00:33 Найти цитируемый пост)
Да текстовые методы Write сами придают "\r\n".

Те, которые записывают текст построчно - да, в частности райтолллайнс, райтлайн и т. д. Просто в данном случае лучше для записи использовать  стримрайтер и правильно указать значение вот этого свойства
http://msdn.microsoft.com/ru-ru/library/system.io.textwriter.newline.aspx

Автор: SKrivosein 9.4.2013, 00:16
Я простенько проверял способ Machaona и он у меня тоже работал. Наверное зависит от конкретных условий, я так побыстрому проверял, чтобы много не кодить. Ну хорошо что есть решение  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)