Flutter SMB连接插件smb_connect的使用
Flutter SMB连接插件smb_connect的使用
原生SMB/CIFS客户端库(用Dart编写)
此库支持流操作和RandomAccessFile。运行速度极快,适用于流媒体音乐和视频。支持的协议版本包括:SMB 1.0、CIFS、SMB 2.0 和 SMB 2.1。
更多示例和使用方法可以查看示例目录。
使用
创建连接
final connect = await SmbConnect.connectAuth(
host: "192.168.1.100",
domain: "",
username: "vadim",
password: "password",
);
列出Samba共享
List<SmbFile> shares = await connect.listShares();
print(shares.map((e) => e.path));
获取文件和文件夹列表
SmbFile folder = await connect.file("/public/");
List<SmbFile> files = await connect.listFiles(folder);
print(files.map((e) => e.path));
创建文件夹
SmbFile folder = await connect.createFolder("/public/folder");
创建空文件
SmbFile file = await connect.createFile("/public/test.txt");
流式读取
SmbFile file = await connect.file("/music/file.mp3");
Stream<Uint8List> reader = await connect.openRead(file);
reader.listen((event) {
print("Read: ${event.length}");
}, onDone: () {
print("File readed");
}, onError: (e) {
print("Error $e");
});
流式写入
SmbFile file2 = await connect.createFile("/public/test.txt");
IOSink writer = await connect.openWrite(file2);
writer.add(utf8.encode("Lorem ipsum dolor sit amet"));
await writer.flush();
await writer.close();
删除文件/文件夹
await connect.delete(file2);
重命名文件/文件夹
SmbFile file = await connect.file("/public/test.txt");
await connect.rename(file, "/public/test1.txt");
随机访问文件
SmbFile file3 = await connect.file("/music/file.mp3");
RandomAccessFile raf = await connect.open(file3);
var buf = await raf.read(10);
await raf.close();
关闭连接
await connect.close();
已知问题
- Flutter版本~3.22.x构建时出现问题(针对iOS进行过验证)。解决方案:将Flutter升级到版本~3.27.x。
完整示例代码
以下是一个完整的示例代码,展示了如何使用SmbConnect
插件:
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:smb_connect/smb_connect.dart';
void main() async {
final connect = await SmbConnect.connectAuth(
host: "192.168.1.100",
domain: "",
username: "<username>",
password: "<password>",
);
// 列出Samba共享
var shares = await connect.listShares();
print(shares.map((e) => e.path).join(","));
// 获取文件和文件夹列表
SmbFile folder = await connect.file("/home");
List<SmbFile> files = await connect.listFiles(folder);
print(files.map((e) => e.path).join(","));
SmbFile folder2 = await connect.createFolder("/home/folder");
assert(folder2.isDirectory());
SmbFile file2 = await connect.createFile("/home/folder/test2.txt");
assert(file2.isExists);
await connect.delete(folder2);
// 创建空文件
SmbFile file = await connect.createFile("/home/test.txt");
print("File is exists: ${file.isExists}");
// 流式写入(例如文本数据)
IOSink writer = await connect.openWrite(file);
writer.add(
utf8.encode("Lorem ipsum dolor sit amet, consectetur adipiscing elit"));
await writer.flush();
await writer.close();
print("File was changed");
// 流式读取
Stream<Uint8List> reader = await connect.openRead(file);
var s = await reader.asyncMap((event) => utf8.decode(event)).join("");
print("File: $s");
// 重命名文件
file = await connect.rename(file, "/home/test2.txt");
print(file.path);
// 删除文件
await connect.delete(file);
// 关闭连接
await connect.close();
exit(0);
}
更多关于Flutter SMB连接插件smb_connect的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter SMB连接插件smb_connect的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用smb_connect
插件来与SMB(Server Message Block)服务器进行连接的代码示例。smb_connect
插件允许Flutter应用访问和操作SMB网络共享上的文件。
首先,你需要在你的pubspec.yaml
文件中添加smb_connect
依赖:
dependencies:
flutter:
sdk: flutter
smb_connect: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来获取依赖。
接下来是一个简单的示例,展示如何使用smb_connect
插件连接到SMB服务器,并列出共享目录中的文件。
import 'package:flutter/material.dart';
import 'package:smb_connect/smb_connect.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
SmbClient? smbClient;
List<String> files = [];
@override
void initState() {
super.initState();
initSmbClient();
}
void initSmbClient() async {
smbClient = SmbClient(
server: 'smb://你的服务器地址', // 替换为你的SMB服务器地址
username: '你的用户名', // 替换为你的SMB用户名
password: '你的密码', // 替换为你的SMB密码
);
try {
await smbClient!.connect();
listFiles();
} catch (e) {
print('连接失败: $e');
}
}
void listFiles() async {
try {
var directoryEntries = await smbClient!.listDirectory('/');
setState(() {
files = directoryEntries.map((e) => e.name).toList();
});
} catch (e) {
print('列出文件失败: $e');
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SMB连接示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('SMB共享中的文件:'),
Expanded(
child: ListView.builder(
itemCount: files.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(files[index]),
);
},
),
),
],
),
),
),
);
}
@override
void dispose() {
smbClient?.disconnect();
super.dispose();
}
}
在这个示例中:
- 添加依赖:在
pubspec.yaml
文件中添加smb_connect
依赖。 - 初始化SMB客户端:在
initState
方法中,创建并初始化SmbClient
实例,并提供服务器地址、用户名和密码。 - 连接到SMB服务器:调用
smbClient.connect()
方法连接到SMB服务器。 - 列出目录中的文件:调用
smbClient.listDirectory('/')
方法列出根目录中的文件,并将文件名存储在files
列表中。 - 显示文件列表:在UI中使用
ListView.builder
构建文件列表。 - 断开连接:在
dispose
方法中,调用smbClient.disconnect()
方法断开与SMB服务器的连接。
请注意,smb_connect
插件的具体API可能随版本更新而变化,因此请参考插件的官方文档和示例代码以获取最新和最准确的信息。