PS:背景需求来自Andorid移动端访问Window共享文件夹
工具:
Unity2018.4.36f1 AS2020.3
什么是smb协议
SMB 一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机、邮件槽(mailslot)、命名管道(named pipe)等资源
打开smb协议
控制面板-程序-启用或关闭Window功能-勾选SMB 1.0/CIFS 文件共享与支持
开启共享文件夹
开启访问权限:
控制面板--网络和Internet--网络和共享中心--高级共享设置
SMBFile流
建立文件流连接 SmbFile remoteFile = new SmbFile("smb://192.168.1.XXX/Test/"); //可以是文件夹或文件 读文件流: SmbFileInputStream inputStream = new SmbFileInputStream("smb://192.168.1.XXX/Test/a.txt");
写文件流: SmbFileOutputStream outputStream =new FileOutputStream(filePath);//filepath=remoteFile.getpath()获取
//localDir保存到本地文件夹路径
public static void smbGet(String remoteUrl, String localDir)
{
InputStream in = null;
OutputStream outputStream = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
if (remoteFile == null) {
return;
}
String fileName =remoteFile.getName();
int length = remoteFile.getContentLength();// 得到文件的大小
byte buffer[] = new byte[length];
SmbFileInputStream inputStream = new SmbFileInputStream(remoteFile); // 建立smb文件输入流
while ((inputStream.read(buffer)) != -1)
{
System.out.write(buffer);
}
inputStream.close();
File localFile = new File(localDir + File.separator+fileName );
try {
//向文件中写入字节数组
String fileSavePath=localFile.getPath();
outputStream = new FileOutputStream(fileSavePath);
outputStream.write(buffer);
outputStream.flush();
//关闭此文件输出流并释放与此流有关的所有系统资源。此文件输出流不能再用于写入字节。 如果此流有一个与之关联的通道,则关闭该通道。
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
catch(Exception e)
{
}
}
if (smbFile.isDirectory()) //判断remoteUrl是否是文件夹
{
}
if (smbFile.isFile()) //判断remoteUrl是否是文件
{
}
//往远程共享目录写入文件,如txt 、Json等
//SmbFile smbFileOut = new SmbFile("smb://192.168.1.xxx/Test/bb.txt");
public static void smbWriteFilesToRemote(String remoteUrl,String data)
{
try
{
SmbFile smbFileOut = new SmbFile(remoteUrl);
if(!smbFileOut.exists())
smbFileOut.createNewFile();
SmbFileOutputStream outputStream = new SmbFileOutputStream(smbFileOut);
outputStream.write(data.getBytes());
outputStream.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
AS打包aar
如果不会打包aar,可以参看我的上一篇文章 AS打包aar
Unity编译APK以及调用aar
参考文献:
1. https://www.cnblogs.com/firstdream/p/5165362.html 基于SMB协议的共享文件读写
2. https://blog.csdn.net/weixin Android访问共享文件夹 Android 访问局域网内的共享文件夹
3.https://blog.csdn.net/u012539700/article/details/文件流读写 Android10文件流读写
4. https://bbs.csdn.net/topics/350063921 Android写文件Permission denied