Как поменять кодировку для записи в файл? - 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
Листинг программы
  1. Unit Unit1;
  2. interface
  3. uses System, System.Drawing, System.Windows.Forms;
  4. type
  5. Form1 = class(Form)
  6. procedure button1_Click(sender: Object; e: EventArgs);
  7. procedure folderBrowserDialog1_HelpRequest(sender: Object; e: EventArgs);
  8. procedure button2_Click(sender: Object; e: EventArgs);
  9. procedure checkBox1_CheckedChanged(sender: Object; e: EventArgs);
  10. procedure Form1_Load(sender: Object; e: EventArgs);
  11. {$region FormDesigner}
  12. private
  13. {$resource Unit1.Form1.resources}
  14. button1: Button;
  15. label1: &Label;
  16. folderBrowserDialog1: FolderBrowserDialog;
  17. button2: Button;
  18. checkBox1: CheckBox;
  19. label2: &Label;
  20. components: System.ComponentModel.IContainer;
  21. {$include Unit1.Form1.inc}
  22. {$endregion FormDesigner}
  23. public
  24. constructor;
  25. begin
  26. InitializeComponent;
  27. end;
  28. end;
  29. implementation
  30. var path : string;
  31. var icacls:='icacls';
  32. var takeown:='takeown';
  33. var pause := true;
  34. procedure FileError;
  35. begin
  36. MessageBox.Show('Не выбран путь для сброса прав доступа','Ошибка',MessageBoxButtons.OK,MessageBoxIcon.Warning);
  37. end;
  38. procedure Form1.button1_Click(sender: Object; e: EventArgs);
  39. begin
  40. folderBrowserDialog1.ShowDialog;
  41. path:=folderBrowserDialog1.SelectedPath;
  42. label1.Text:=path;
  43. end;
  44. procedure Form1.folderBrowserDialog1_HelpRequest(sender: Object; e: EventArgs);
  45. begin
  46. end;
  47. procedure Form1.button2_Click(sender: Object; e: EventArgs);
  48. begin
  49. if path='' then FileError else
  50. begin
  51. var f : PABCSystem.Text;
  52. assign(f,'tmp.bat');
  53. rewrite(f,'866');
  54. //writeln(f,'chcp 1252');
  55. writeln(f,takeown,' /f ','"',path,'"',' /r /d y');
  56. writeln(f,icacls,' "',path,'"',' /reset /T');
  57. if pause then writeln(f,'pause');
  58. PABCSystem.close(f);
  59. Execute('tmp.bat');
  60. end;
  61. end;
  62. procedure Form1.checkBox1_CheckedChanged(sender: Object; e: EventArgs);
  63. begin
  64. if pause then pause:=false else pause:=true;
  65. end;
  66. procedure Form1.Form1_Load(sender: Object; e: EventArgs);
  67. begin
  68. end;
  69. end.

Решение задачи: «Как поменять кодировку для записи в файл?»

textual
Листинг программы
  1. procedure Form1.button2_Click(sender: Object; e: EventArgs);
  2. begin
  3.   if path='' then FileError else
  4.   begin
  5.     WriteAllLines('tmp.bat',
  6.       new string[3](Format('{0} /f "{1}" /r /d y', takeown, path),
  7.                     Format('{0} "{1}" /reset /T', icacls, path),
  8.                     pause ? 'pause' : ''
  9.                     ),
  10.       System.Text.Encoding.GetEncoding(866));
  11.     Execute('tmp.bat');
  12.   end;
  13. end;

Объяснение кода листинга программы

  1. Задача программы - поменять кодировку для записи в файл.
  2. Если путь к файлу пустой, то выводится сообщение об ошибке.
  3. Используется функция WriteAllLines для записи в файл 'tmp.bat' массива строк.
  4. Массив строк содержит три элемента.
  5. Первая строка формируется с помощью функции Format и содержит команду 'takeown /f путь к файлу /r /d y'.
  6. Вторая строка формируется с помощью функции Format и содержит команду 'icacls путь к файлу /reset /T'.
  7. Если переменная pause имеет значение 'true', то в качестве третьей строки используется 'pause'.
  8. Если переменная pause имеет значение 'false', то в качестве третьей строки используется пустая строка.
  9. Для записи в файл используется кодировка System.Text.Encoding.GetEncoding(866).
  10. Выполняется команда 'tmp.bat'.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы