Xamarin/.NET Core対応SMBアクセスライブラリを公開しました
Xamarin, .NET Coreで動作するSMB/CIFSライブラリ SharpCifs.Std
を公開しました。
Android / iOS / Linux から、Windows共有フォルダ へアクセスするためのものです。
概要
Windows Phone 8
用のSMBライブラリSharpCifs
を、.NET Standard
で動くように少々手を加えたものです。
SharpCifs
はJCIFS
の移植版なので、移植の移植といったところ。
公開にあたっては、SharpCifs
作者のJ. Arturoさんに快諾頂き、嬉しい限りです!
インストール
パッケージをnuget.org
に公開しているので、Visual Studio のNuGetパッケージマネージャ
からインストールできます。
プレリリース版につき、「プレリリースを含める」チェックをONにしてください。
使い方
JCIFS
そのままです。
フォルダ上のアイテム取得:
var folder = new SmbFile("smb://UserName:Password@ServerName/ShareName/Folder/")); //<-need last'/' in directory var epocDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); foreach (var item in folder.ListFiles()) { var lastModDate = baseDate.AddMilliseconds(item.LastModified()).ToLocalTime(); Console.WriteLine($"Name: {item.GetName()}, isDir?: {item.IsDirectory()}, Date: {lastModDate.ToString("yyyy-MM-dd HH:mm:ss")}"); }
ファイル読み込み:
var file = new SmbFile("smb://UserName:Password@ServerName/ShareName/Folder/FileName.txt")); var readStream = file.GetInputStream(); var buffer = new byte[1024*8]; var memStream = new MemoryStream(); int size; while ((size = readStream.Read(buffer, 0, buffer.Length)) > 0) memStream.Write(buffer, 0, size); Console.WriteLine(Encoding.UTF8.GetString(memStream.ToArray()));
ファイル書き込み:
var file = new SmbFile("smb://UserName:Password@ServerName/ShareName/Folder/NewFileName.txt")); file.CreateNewFile(); var writeStream = file.GetOutputStream(); writeStream.Write(Encoding.UTF8.GetBytes("Hello!"));
参考:JCIFS API
https://jcifs.samba.org/src/docs/api/
こんな感じに動きます
試しに、共有フォルダ内のリストを取ってきます。
アクセス先はこちら。
おおむねこんなコードを書きます。
日時はlongで取れてきます。UnixTimeのMillisec単位になってます。
var epocDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); var folder = new SmbFile("smb://UserName:Password@ServerName/ShareName/Musics/Mp3/Savage Garden/AFFIRMATION/"); var list = new List<string>(); foreach (var item in folder.ListFiles()) { var lastModDate = epocDate.AddMilliseconds(item.LastModified()).ToLocalTime(); list.Add($"{item.GetName()}: {(item.IsDirectory() ? "folder" : "file")}, {lastModDate.ToString("yyyy-MM-dd HH:mm:ss")}"); } list.Sort(); var result = string.Join("\r\n", list);
Xamarin.Android
Xamarin.iOS
.NET Core
各プラットフォームとも、ファイル、ディレクトリどちらも取れてます!
文字化け無く、日時も正確ですね。
参考リンク
GitHub - zinkpad/SharpCifs: SharpCifs is a port of JCIFS to C#
https://github.com/zinkpad/SharpCifs
JCIFS - The Java CIFS Client Library
https://jcifs.samba.org/
GitHub - ume05rw/SharpCifs.Std: [pre-release] Port of SharpCifs to .NET Standard
https://github.com/ume05rw/SharpCifs
NuGet Gallery - SharpCifs.Std 0.1.3-beta1
https://www.nuget.org/packages/SharpCifs.Std/