Dart ProcessResult
最后修改于 2025 年 4 月 4 日
Dart 中的 ProcessResult
类表示运行进程的结果。它提供了对退出代码、标准输出、标准错误和进程信息的访问。
Process.run
和 Process.runSync
等函数会返回 ProcessResult。它是 Dart 的 dart:io
库的一部分。
基本定义
ProcessResult
是一个包含进程执行结果的不可变对象。它在进程完成时创建,不能被修改。
关键属性包括 exitCode、stdout、stderr 和 pid。这些属性提供了关于进程执行和输出的完整信息。
ProcessResult 基本用法
此示例演示了基本的进程执行和结果检查。
import 'dart:io'; void main() async { var result = await Process.run('ls', ['-l']); print('Exit code: ${result.exitCode}'); print('Stdout: ${result.stdout}'); print('Stderr: ${result.stderr}'); }
我们运行 'ls -l' 命令并检查其结果。ProcessResult
对象包含所有执行详情,包括输出流和退出状态。
$ dart main.dart Exit code: 0 Stdout: total 8 -rw-r--r-- 1 user staff 123 Apr 4 10:00 main.dart Stderr:
处理命令错误
此示例演示了使用 ProcessResult 进行错误处理。
import 'dart:io'; void main() async { var result = await Process.run('grep', ['pattern', 'nonexistent.txt']); if (result.exitCode != 0) { print('Command failed with exit code ${result.exitCode}'); print('Error output: ${result.stderr}'); } else { print('Output: ${result.stdout}'); } }
我们检查 exitCode 以确定命令是否成功。非零退出代码通常表示错误,详细信息可在 stderr 中找到。这种模式对于健壮的进程处理很常见。
$ dart main.dart Command failed with exit code 2 Error output: grep: nonexistent.txt: No such file or directory
解析命令输出
此示例演示了从 ProcessResult 解析命令输出。
import 'dart:io'; void main() async { var result = await Process.run('date', ['+%Y-%m-%d']); if (result.exitCode == 0) { var date = (result.stdout as String).trim(); print('Current date: $date'); } else { print('Failed to get date'); } }
我们执行 date 命令并解析其输出。stdout 被转换为 String
并进行修剪以进行干净处理。这演示了如何处理命令输出。
$ dart main.dart Current date: 2025-04-04
运行多个命令
此示例演示了处理多个命令及其结果。
import 'dart:io'; void main() async { var commands = [ ['echo', 'Hello Dart'], ['uname', '-a'], ['whoami'] ]; for (var cmd in commands) { var result = await Process.run(cmd[0], cmd.sublist(1)); print('Command: ${cmd.join(' ')}'); print('Exit code: ${result.exitCode}'); print('Output: ${(result.stdout as String).trim()}'); print('---'); } }
我们按顺序执行多个命令并处理每个结果。该示例系统地展示了如何处理不同类型的命令及其输出。
$ dart main.dart Command: echo Hello Dart Exit code: 0 Output: Hello Dart --- Command: uname -a Exit code: 0 Output: Darwin Kernel Version 22.1.0... --- Command: whoami Exit code: 0 Output: user ---
处理二进制输出
此示例演示了如何处理进程的二进制输出。
import 'dart:io'; void main() async { var result = await Process.run('ls', ['-l'], stdoutEncoding: null); if (result.exitCode == 0) { var output = result.stdout as List<int>; print('Binary output length: ${output.length} bytes'); print('First 10 bytes: ${output.take(10)}'); } }
通过将 stdoutEncoding 设置为 null,我们获得原始字节而不是字符串。这对于二进制数据处理非常有用。输出可作为 List<int> 获得。
$ dart main.dart Binary output length: 123 bytes First 10 bytes: (116, 111, 116, 97, 108, 32, 56, 13, 10, 45)
最佳实践
- 检查退出代码:始终验证进程是否成功
- 处理输出:同时处理 stdout 和 stderr
- 使用编码:为文本输出指定正确的编码
- 超时:考虑为长时间运行的进程添加超时
- 清理:确保进程被正确终止
来源
本教程通过实际示例介绍了 Dart 的 ProcessResult 类,展示了在 Dart 应用程序中执行进程、处理输出和管理错误的方法。
作者
列出 所有 Dart 教程。