Как поменять кодировку для записи в файл? - PascalABC.NET
Формулировка задачи:
Программа должна создавать bat-файл с командами takeown и icacls. Когда я открываю файл в любом редакторе, то всё на месте, однако, когда программа пытается выполнить файл, то в коммандной строке винды русские символы в пути файла превращаются в нечитабельную кашу, но это каша из русских символов. Например, "Новая папка" превращается в "═ютр* яряър". С версии 3.1 в ABC.NET добавили параметр кодировки для Reset, Rewrite, Append, OpenRead, OpenWrite и OpenAppend. У меня версия 3.1.1190. При попытке написать rewrite(f,866) выдаёт ошибку, но c rewrite(f,'866') ошибки нет, но кодировка всё-равно стандартная 1251. Как поменять её на 866, котоую понимает cmd? Винда 8.1
Листинг программы
- Unit Unit1;
- interface
- uses System, System.Drawing, System.Windows.Forms;
- type
- Form1 = class(Form)
- procedure button1_Click(sender: Object; e: EventArgs);
- procedure folderBrowserDialog1_HelpRequest(sender: Object; e: EventArgs);
- procedure button2_Click(sender: Object; e: EventArgs);
- procedure checkBox1_CheckedChanged(sender: Object; e: EventArgs);
- procedure Form1_Load(sender: Object; e: EventArgs);
- {$region FormDesigner}
- private
- {$resource Unit1.Form1.resources}
- button1: Button;
- label1: &Label;
- folderBrowserDialog1: FolderBrowserDialog;
- button2: Button;
- checkBox1: CheckBox;
- label2: &Label;
- components: System.ComponentModel.IContainer;
- {$include Unit1.Form1.inc}
- {$endregion FormDesigner}
- public
- constructor;
- begin
- InitializeComponent;
- end;
- end;
- implementation
- var path : string;
- var icacls:='icacls';
- var takeown:='takeown';
- var pause := true;
- procedure FileError;
- begin
- MessageBox.Show('Не выбран путь для сброса прав доступа','Ошибка',MessageBoxButtons.OK,MessageBoxIcon.Warning);
- end;
- procedure Form1.button1_Click(sender: Object; e: EventArgs);
- begin
- folderBrowserDialog1.ShowDialog;
- path:=folderBrowserDialog1.SelectedPath;
- label1.Text:=path;
- end;
- procedure Form1.folderBrowserDialog1_HelpRequest(sender: Object; e: EventArgs);
- begin
- end;
- procedure Form1.button2_Click(sender: Object; e: EventArgs);
- begin
- if path='' then FileError else
- begin
- var f : PABCSystem.Text;
- assign(f,'tmp.bat');
- rewrite(f,'866');
- //writeln(f,'chcp 1252');
- writeln(f,takeown,' /f ','"',path,'"',' /r /d y');
- writeln(f,icacls,' "',path,'"',' /reset /T');
- if pause then writeln(f,'pause');
- PABCSystem.close(f);
- Execute('tmp.bat');
- end;
- end;
- procedure Form1.checkBox1_CheckedChanged(sender: Object; e: EventArgs);
- begin
- if pause then pause:=false else pause:=true;
- end;
- procedure Form1.Form1_Load(sender: Object; e: EventArgs);
- begin
- end;
- end.
Решение задачи: «Как поменять кодировку для записи в файл?»
textual
Листинг программы
- procedure Form1.button2_Click(sender: Object; e: EventArgs);
- begin
- if path='' then FileError else
- begin
- WriteAllLines('tmp.bat',
- new string[3](Format('{0} /f "{1}" /r /d y', takeown, path),
- Format('{0} "{1}" /reset /T', icacls, path),
- pause ? 'pause' : ''
- ),
- System.Text.Encoding.GetEncoding(866));
- Execute('tmp.bat');
- end;
- end;
Объяснение кода листинга программы
- Задача программы - поменять кодировку для записи в файл.
- Если путь к файлу пустой, то выводится сообщение об ошибке.
- Используется функция WriteAllLines для записи в файл 'tmp.bat' массива строк.
- Массив строк содержит три элемента.
- Первая строка формируется с помощью функции Format и содержит команду 'takeown /f
путь к файлу
/r /d y'. - Вторая строка формируется с помощью функции Format и содержит команду 'icacls
путь к файлу
/reset /T'. - Если переменная pause имеет значение 'true', то в качестве третьей строки используется 'pause'.
- Если переменная pause имеет значение 'false', то в качестве третьей строки используется пустая строка.
- Для записи в файл используется кодировка System.Text.Encoding.GetEncoding(866).
- Выполняется команда 'tmp.bat'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д