Использование двойных кавычек внутри строки в dart приводит к нежелательному результату

#string #flutter #android-studio #dart

Вопрос:

ИНФОРМАЦИЯ О FLUTTER И IDE (пожалуйста, дайте мне знать, если у вас есть дополнительная информация) Кстати, я использую Android Studio 4.2.2 (версия от 24 июня 2021 года), несмотря на то, что говорит врач Flutter.

 C:UsersAdministrator>flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 2.2.3, on Microsoft Windows [Version 10.0.19041.1052], locale tr-TR)
[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[√] Chrome - develop for the web
[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.9.4)
[!] Android Studio
    X android-studio-dir = C:ProgramFilesAndroidAndroid Studio
    X Android Studio not found at C:ProgramFilesAndroidAndroid Studio
[√] VS Code (version 1.57.1)
[√] Connected device (3 available)

Dart SDK version: 2.13.4 (stable) (Wed Jun 23 13:08:41 2021  0200) on "windows_x64"
 

Что я пытаюсь сделать, так это создать строку для использования ее в качестве аргумента внутри процесса.Run.
Я использую командную строку для запуска FastCopy(самый быстрый инструмент копирования в Windows и действительно хороший процесс очереди). Мне нужно использовать двойные кавычки, не нарушая код, потому что без открытия и закрытия двойными кавычками («) FastCopy не будет работать там, где в имени папки есть пробел

Вот пример:

 String path : r"C:UsersAdministratorDesktopsample.txt"
String output: r"C:"

// This will not cause any problems because folder names have no space
// This has no double quote
Process.run("cmd",
           ['/c start /wait C:\Users\Administrator\FastCopy\FastCopy.exe /cmd=force_copy /auto_close /estimate=TRUE $path /to=$output'],
           runInShell: true,);
 

И теперь, когда я помещаю двойные кавычки(«) перед и после переменных:

 String path : r"C:UsersAdministratorDesktopsample.txt"
String output: r"C:"

// This has double quote in it
Process.run("cmd",
           ['/c start /wait C:\Users\Administrator\FastCopy\FastCopy.exe /cmd=force_copy /auto_close /estimate=TRUE "$path" /to="$output"'],
           runInShell: true,);
 

Если я выведу часть аргументов в виде строки, результатом будет ожидаемая строка вывода. Консоль показывает, какой она должна быть. И когда я запускаю его сам с консоли cmd, он работает так, как ожидалось. Но когда я запускаю его внутри флаттера, он добавляет еще одно «C:» перед строкой, чтобы оно стало

 C:C:UsersAdministratorDesktopprofanity_TR.txt
 

И это выдает ошибку каталога. Ошибка возникает из-за FastCopy.exe которые я связал.

В настоящее время я использую версию без кавычек и не имею ошибок. Но я действительно хочу решить эту проблему, потому что использую ее с каталогом, в названии которого есть пробел, и не хочу сталкиваться с проблемами такого типа.

Комментарии:

1. Чтобы уточнить, нужно ли вам использовать двойные кавычки в качестве символа внутри строки? Разве вы не можете решить эту проблему, поставив » » перед двойной кавычкой?

2. @L. Gangemi Спасибо за ответ, но ничего не меняется с введением этого символа, просто уберите символ, который я использую ‘(одинарная кавычка), мне не нужно использовать (символ побега). Независимо от того, что я пробовал, и это то же самое.

3. Можете ли вы использовать Process.run('cmd', '/c', 'start', '/wait', 'C:\Users\Administrator\FastCopy\FastCopy.exe', '/cmd=force_copy', '/auto_close', '/estimate=TRUE', path, '/to=$output'], runInShell: true) вместо этого? То есть передайте список строк аргументов вместо одной строки и позвольте Process.run цитировать то, что вам необходимо.

4. Кроме того, ваш пример пути ( "r"C:UsersAdministratorDesktopsample.txt" ) не совпадает с вашим выводом ( "C:C:UsersAdministratorDesktopprofanity_TR.txt" ). Что это такое? И где именно вы наблюдаете последнюю строку? Вы проверили, что Process.run вызывается с ожидаемой строкой после интерполяции строки?

5. @jamesdlin Извините, я просто изменил файл образца, но да, результат тот же. Как я уже сказал в своем вопросе, я заметил избыток «C:» в самой FastCopy.