1. 程式人生 > >SmbFile 類實現區域網檔案共享讀寫

SmbFile 類實現區域網檔案共享讀寫

  業務需求,需要讀取區域網內的任意PC上的檔案,用java去實現,查閱資料,結合window 的檔案共享功能和SmbFile類的支援可以實現這個功能。

SMB 一種客戶機/伺服器、請求/響應協議。通過 SMB 協議,客戶端應用程式可以在各種網路環境下讀、寫伺服器上的檔案,以及對伺服器程式提出服務請求。此外通過 SMB 協議,應用程式可以訪問遠端伺服器端的檔案、以及印表機、郵件槽(mailslot)、命名管道(named pipe)等資源。

jcifs的開發方法類似java的檔案操作功能,它的資源url定位:
smb://{user}:{password}@{host}/{path}, 
smb為協議名,user和password分別為共享檔案機子的登陸名和密碼,@後面是要訪問的資源的主機名或IP地址。最後是資源的共享資料夾名稱和共享資源名。 例如smb://administrator:[email protected]/test/response.txt。 在JAVA程式中,使用如下方式獲得一個遠端共享檔案(設定共享檔案的許可權——讀取、修改、完全控制)的控制代碼:SmbFile file = newSmbFile("smb://guest:[email protected]/share/a.txt"); 這裡的控制代碼不僅限於遠端的共享檔案,還可能是共享資料夾。 isFile()方法和isDirectory()用來判斷這個控制代碼對應的資源的真實屬性。如果是共享資料夾,通過呼叫它的list()方法將獲得其中資源的列表。 List方法支援過濾器機制,有兩種過濾器可供使用,一種是SmbFileFilter,另一種是SmbFilenameFilter ,這兩個在jcifs中作為接口出現,你可以根據自己的需要派生出個性化的過濾器,實現介面中的accept方法,以滿足不同業務的需求。    SmbFileInputStream 是smb 檔案的輸入流,它的功能是以流的方式開啟一個SmbFile:SmbFileInputStream in
= new SmbFileInputStream(file);SmbFileInputStream提供read方法,你可以從這個流中讀出遠端檔案全部的內容。

開啟共享

首先在服務機上新建好要共享的資料夾,具體方法可以參考上一節的總結:

新增依賴

有了可以共享的資料夾後,我們就可以在專案中去使用它了,如果你的專案是使用的Maven來構建的,那麼很簡單,在你專案的pom.xml資料夾中新增如下的依賴就可以引用所有的SmbFile類的jar包了。

<dependency>
       <groupId>jcifs</groupId
>
<artifactId>jcifs</artifactId> <version>1.3.17</version> </dependency>

檔案讀寫

這一部分主要總結平常對檔案的一些操作,例如讀取,複製,寫入,刪除等操作。

讀取檔案

//主要利用類 SmbFile 去實現讀取共享資料夾 shareFile 下的所有檔案(資料夾)的名稱
String URL="smb://192.168.0.100/shareFile/";
// String URL="smb://xxx:[email protected]/shareFile/";
SmbFile smbfile=new SmbFile(URL);
try {
      if(!smbfile.exists()){
          System.out.println("no such folder");
      }
      else{
           SmbFile[] files = smbfile.listFiles();
            for (SmbFile f : files) {
               System.out.println(f.getName());
            }
       }
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

上傳檔案

//從本地讀取檔案上傳到服務主機中
String url_local="c://text.txt";
String URL_remote="smb://192.168.0.100/shareFile/uploadFile.txt";
File localfile=new File(url);
InputStream ins = new FileInputStream(localfile);
SmbFile smbfile=new SmbFile(URL_remote);
if(smbfile.exists()){
    System.out.println("file is exists");
}else{
    smbFile.connect();
    OutputStream outs = new SmbFileOutputStream(smbfile);
    byte[] buffer = new byte[4096];
    int len = 0; //讀取長度
    while ((len = ins.read(buffer, 0, buffer.length)) != -1) {
        outs.write(buffer, 0, len);
    }
    outs.flush(); //重新整理緩衝的輸出流
    System.out.println("寫入成功");
}

//注意SmbFile本來就不穩定,一定要注意把所有的流關閉啊。try-catch挺煩的,用IDE自己生成吧!

刪除檔案

 String url = "smb://192.168.1.116/ShareFile/test.txt";
 SmbFile file=new SmbFile(url);
 if(file.exists()){
     file.delete();
     System.out.println("delete the file");
 }
 //自己捕獲異常,補上try-catch 即可

總結

在使用的SmbFile來建立檔案和資料夾的時候,發現他不能支援像File類一樣的直接構造資料夾和檔案的建構函式,File(String parent,String fileName),但是SmbFile會將檔名組裝到資料夾中生成資料夾,沒辦法,只能先生成parent folder 然後去建立檔案。

相關推薦

SmbFile 實現區域網檔案共享

  業務需求,需要讀取區域網內的任意PC上的檔案,用java去實現,查閱資料,結合window 的檔案共享功能和SmbFile類的支援可以實現這個功能。 SMB 一種客戶機/伺服器、請求/響

Python實現Excel檔案操作

在Python的學習過程中,有時候需要對Excel檔案進行讀寫操作。其中主要用到兩大模組:使用xlwt module將資料寫入Excel表格,使用xlrd module從Excel讀取資料。下面介紹如何實現使用python對Excel進行讀寫操作。 安裝模組 $ sudo pip

對映網路驅動器實現區域網檔案共享

"對映網路驅動器"是實現磁碟共享的一種方法,具體來說就是利用區域網將自己的資料儲存在另外一臺電腦上或者把另外一臺電腦裡的檔案虛擬到自己的機器上。把遠端共享資源對映到本地後,在"我的電腦"中多了一個碟符,就像自己的電腦上多了一個磁碟,可以很方便進行操作.(如"建立一個檔案""複製""貼上"等)。等效於在"網

java實現檔案操作(按要求在檔案指定位置新增內容)

本問提到的讀檔案進行讀操作使用的是FileInputStream方法,寫操作使用的是FileOutputStream方法,將字元內容進行拼接主要使用的是str+"a"和StringBuffer方法.下面是一個指令碼檔案#!/bin/bash #下面設定輸入檔案,把使用者執行p

HTML5實現本地JSON檔案

參考: 使用HTML5來實現本地檔案讀取和寫入  (FileReader讀取json檔案,FileSaver.js儲存json檔案) w3school <input>標籤   FileReader WebAPI介面 FileSaver.js下載地址 File

檔案記憶體對映mmap解決大檔案快速問題和程序間共享記憶體

mmap函式主要用途有三個: 1、將一個普通檔案對映到記憶體中,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代I/O讀寫,以獲得較高的效能; 2、將特殊檔案進行匿名記憶體對映,可以為關聯程序提供共享記憶體空間; 3、為無關聯的程序提供共享記憶體空間,一般也是將一個普通檔案對映到

Python:python3-安裝和使用庫-檔案

一、類 init方法必須有self引數 二、安裝和使用庫 1.使用庫 2.安裝庫 pip install resquests import requests html = rewuests.get(‘http://king.info’).content

c實現功能(11)對二進位制檔案

#include <stdio.h> #include <string.h> int main(){ //實現對二進位制檔案的讀取 //開啟檔案 FILE *p = fopen("D:\\test\\a.wmv", "rb")

Java實現CSV格式檔案(操作API)

首先引入maven <dependency> <groupId>net.sourceforge.javacsv</groupId> <

Java實現對ftp的檔案(apache.commons.net.ftp)

這裡僅僅是對ftp工具類的簡單使用,很多東西還不是很瞭解。當然學以致用,先用到這裡吧。 public class FtpTest { /** * 向ftp寫檔案(資料) */ @Test public void uploadFile() {

無鎖程式設計:c++11基於atomic實現共享鎖(優先)

在多執行緒狀態下,對一個物件的讀寫需要加鎖,基於CAS指令的原子語句可以實現高效的執行緒間協調。關於CAS的概念參見下面的文章: 在c++11中CAS指令已經被封裝成了 非常方便使用的atomic模板類, 詳情參見: 以下程式碼利用atomic實現了

QT ini配置檔案(使用QTextStream)

1、寫ini配置檔案 bool saveFile(const QString &fileFullName) {if(fileFullName.isEmpty())return false;Q

.NET Framework 4 檔案IO的增強 激動人心的強大 或許正是你所期待的 基庫中的新增內容 轉自msdn雜誌

CLR 全面透析 .NET Framework 4 基類庫中的新增內容 使用 Microsoft .NET 的每個人幾乎都會用到基類庫 (BCL)。一個更好的 BCL 幾乎可以惠及每一位託管程式碼開發人員。 此專欄重點介紹 .NET 4 Beta 1 在 BCL 中新增的功能。 先前的文章中已經介紹了

Java 實現檔案隨機-RandomAccessFile

1.介紹 現有如下的一個需求,向已存在1G資料的txt文本里末尾追加一行文字,內容如下“Lucene是一款非常優秀的全文檢索庫”。可能大多數朋友會覺得這個需求很easy,說實話,確實easy,然後XXX君開始實現了,直接使用Java中的流讀取了txt文本里原來

獨家解讀:簡單又強大的配置檔案 Config

一、引言 在專案過程中,難免會需要一個方便的配置檔案讀寫類,它可以像遊戲的存檔檔案一樣,記錄著我們當前專案的配置資訊,以至於方便我們每次初始化執行的時候可以從這個配置檔案讀取上一次的配置資訊,當然也可以在程式執行過程中記錄使用者的配置設定資訊。 我們理想中的

C++實現簡單的檔案

這裡的程式碼只是自己的筆記,也供別人參考。但請勿噴。 //C++實現檔案讀取 #include <fstream> int CountLines(const char *filename)//獲取檔案的行數 { ifstream ReadFile;//在

從零開始學C++之IO流庫(三):檔案、二進位制檔案檔案隨機

#include <cassert>#include <iostream>#include <fstream>#include <string>using namespace std;struct Test {     int a;     int b; };i

Faster R-CNN Tensorflow實現之資料集製作(2)--- xml檔案修改

接著上一篇的文章繼續製作自己的資料集,由於需要將資料集弄成與VOC 2007資料集一樣的格式,需要自己手動標註資料,根據網上前輩的經驗,這裡使用了labelImg,版本用了windows_v1 .7.0,操作簡單方便。使用該軟體進行標註後將直接生成以與圖片名稱相同的.XML檔

使用CFile檔案進行

CFile類提供了對檔案進行開啟,關閉,讀,寫,刪除,重新命名以及獲取檔案資訊等檔案操作的基本功能,足以處理任意型別的檔案操作 一個讀寫檔案的例子:檔案I/O   雖然使用CArchive類內建的序列化功能是儲存和載入永續性資料的便捷方式,但有時在程式中需要對檔案處理過程擁有更多的控制權,對於這種檔案輸入輸

Java 實現文件隨機-RandomAccessFile

randomaccessfile類RandomAccessFile是Java中輸入,輸出流體系中功能最豐富的文件內容訪問類,它提供很多方法來操作文件,包括讀寫支持,與普通的IO流相比,它最大的特別之處就是支持任意訪問的方式,程序可以直接跳到任意地方來讀寫數據。如果我們只希望訪問文件的部分內容,而不是把文件從頭