Flutter SMB连接插件smb_connect的使用

发布于 1周前 作者 sinazl 来自 Flutter

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();
  }
}

在这个示例中:

  1. 添加依赖:在pubspec.yaml文件中添加smb_connect依赖。
  2. 初始化SMB客户端:在initState方法中,创建并初始化SmbClient实例,并提供服务器地址、用户名和密码。
  3. 连接到SMB服务器:调用smbClient.connect()方法连接到SMB服务器。
  4. 列出目录中的文件:调用smbClient.listDirectory('/')方法列出根目录中的文件,并将文件名存储在files列表中。
  5. 显示文件列表:在UI中使用ListView.builder构建文件列表。
  6. 断开连接:在dispose方法中,调用smbClient.disconnect()方法断开与SMB服务器的连接。

请注意,smb_connect插件的具体API可能随版本更新而变化,因此请参考插件的官方文档和示例代码以获取最新和最准确的信息。

回到顶部