Try .NET Core

.NET Coreを動かした、試した記録を書き残します。

Xamarin/.NET Core対応SMBアクセスライブラリを公開しました

Xamarin, .NET Coreで動作するSMB/CIFSライブラリ SharpCifs.Std を公開しました。
Android / iOS / Linux から、Windows共有フォルダ へアクセスするためのものです。

概要

Windows Phone 8用のSMBライブラリSharpCifsを、.NET Standardで動くように少々手を加えたものです。
SharpCifsJCIFSの移植版なので、移植の移植といったところ。

ソースがこちらNuGetパッケージはこちらです。

公開にあたっては、SharpCifs作者のJ. Arturoさんに快諾頂き、嬉しい限りです!

インストール

パッケージをnuget.orgに公開しているので、Visual StudioNuGetパッケージマネージャからインストールできます。
プレリリース版につき、「プレリリースを含める」チェックをONにしてください。
f:id:try_dot_net_core:20161228121610j:plain

使い方

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/

こんな感じに動きます

試しに、共有フォルダ内のリストを取ってきます。
アクセス先はこちら。
f:id:try_dot_net_core:20161228122856j:plain

おおむねこんなコードを書きます。
日時は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 f:id:try_dot_net_core:20161228140214j:plain

Xamarin.iOS f:id:try_dot_net_core:20161228124235j:plain

.NET Core f:id:try_dot_net_core:20161228124249j:plain

各プラットフォームとも、ファイル、ディレクトリどちらも取れてます!
文字化け無く、日時も正確ですね。

参考リンク

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/