SMB共享資料夾操作
最近接到了要獲取其他伺服器上檔案操作的需求,使用了網路共享資料夾的形式來進行處理。
首先在伺服器上設定一個資料夾為共享資料夾,這裡使用了碟符G:
之後在本地我的電腦下郵件生成一個網路位置,輸入ip所在:例子:\\172.17.16.16\G,取一個別名,例子為g;
之後即可通過這個目錄操作遠端的資料夾,記得設定許可權為完全控制。
貼一下主要的兩個工具類的方法:
package com.neusoft.jkysjbs.action.comm;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
public class SmbFileTransfer {
/*
* smb類 用於對共享資料夾的檔案進行上傳下載使用,直接使用file類不能獲取到相關的檔案物件
*
*/
/**
* 將本地檔案上傳到共享資料夾中
*/
public static void smbUpload(String localDir,String remoteUrl) {
InputStream in = null;
OutputStream out = null;
try {
//獲取圖片
File localFile = new File(localDir);
SmbFile remoteFile = new SmbFile(remoteUrl + "/" + localFile.getName());
remoteFile.connect(); //嘗試連線
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
byte[] buffer = new byte[4096];
int len = 0; //讀取長度
while ((len = in.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, len);
}
out.flush(); //重新整理緩衝的輸出流
}
catch (Exception e) {
String msg = "發生錯誤:" + e.getLocalizedMessage();
System.out.println(msg);
}
finally {
try {
if(out != null) {
out.close();
}
if(in != null) {
in.close();
}
}
catch (Exception e) {}
}
}
/**
* 將檔案從共享資料夾中下載下來到本地
* @param remoteUrl
* @param localDir
*/
public static void smbGet(String remoteUrl, String localDir) {
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
if (remoteFile == null) {
System.out.println("共享檔案不存在");
return;
}
String fileName = remoteFile.getName();
//建立資料夾(根目錄下直接建立檔案可以直接new File,如果是多層目錄下檔案的建立,需要先建立多層資料夾,然後用輸入流在資料夾相應目錄下再將檔案建立)
File localFile = new File(localDir + File.separator);
if(!localFile.exists()){//如果資料夾不存在
//建立資料夾,mkdir是建立根目錄,mkdirs建立多層目錄
localFile.mkdirs();
}
//建立檔案
BufferedWriter bw=new BufferedWriter(new FileWriter(localDir + File.separator + fileName));
bw.close();
File localFiles = new File(localDir + File.separator + fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFiles));
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//格式 smb://共享伺服器的使用者:密碼@ip/共享資料夾別名/其下目錄
smbGet("smb://username: [email protected]/g/ftp/test.zip","E:/test/");
smbUpload("E:/test.zip","smb://username:[email protected]/g/ftp/");
}
}
個人的思考是:SmbFile應該不是File的一個子類,很多方法相似,但並沒有繼承關係
而且應該有更簡便快捷的處理辦法,如果有人瞭解請在評論指教,多謝。
另外類似於在指定url下生成,壓縮檔案這種操作,使用smbFile做不到,多數用法也是上傳下載我的處理辦法是在本地生成好--傳上去--刪除本地,不得不說很粗糙,如果哪位大神有好辦法也請多指教,感謝閱讀。
相關推薦
SMB共享資料夾操作
最近接到了要獲取其他伺服器上檔案操作的需求,使用了網路共享資料夾的形式來進行處理。 首先在伺服器上設定一個資料夾為共享資料夾,這裡使用了碟符G: 之後在本地我的電腦下郵件生成一個網路位置,輸入ip所在:例子:\\172.17.16.16\G,取一個別名,例子為g; 之後
C# 操作共享資料夾
/// <summary> /// 共享檔案操作類 /// </summary> public class SharedFolderManager { public SharedFolderManager() { // //TODO: 在
smb讀取共享資料夾
SMB協議 SMB(Server Message Block)通訊協議是微軟(Microsoft)和英特爾(Intel)在1987年制定的協議,主要是作為Microsoft網路的通訊協議。SMB 是在會話層(session layer)和表示層(presentation la
centos 6.3 如何修改/etc/samba/smb.conf 檔案設定多個共享資料夾,一些是公開的,一些是需要認證的
第一節、samba是幹什麼的?它有什麼用? Samba(SMB是其縮寫) 是一個網路伺服器,它是Linux作為本地伺服器最重要的一個服務,用於Linux和Windows共享檔案之用;Samba可以用於Windows和Linux之間的共享檔案,也一樣用於Linux和Linux之間的共享檔案;不過對於L
linux 檔案及資料夾操作總結
文章目錄 檔案基本操作 檢視 複製刪除移動 建立 其他 許可權(包括資料夾) 檢視許可權 許可權含義 修改許可權 修改許可權(數字)
Ubuntu和Windows相互共享資料夾
一、Ubuntu訪問Windows共享資料夾 1、對需要共享資料夾右擊->屬性->共享 2、選擇要與其共享的使用者,選擇好使用者點選有點新增按鈕新增,然後點選下方的共享按鈕 3、完成共享 4、成功共享後可以在計算機管理檢視已共享資料夾 5、Windows還需要進行一些設定
windows清除訪問共享資料夾的登陸資訊
https://jingyan.baidu.com/article/c843ea0b70797e77931e4a96.html 當在命令提示視窗輸入net use命令時,會顯示本機快取的共享登入資訊,如果你想切換使用者,則可以刪除那條快取的記錄即可。 舉個例子,如上圖顯示,
用不同的使用者名稱和密碼登入網路上的共享資料夾
2014-05-20 22:49 by MikeZhou, 10697 閱讀, 0 評論, 收藏, 編輯 https://www.cnblogs.com/jinjiangongzuoshi/p/3740218.html 網路共享時,
Python檔案及資料夾操作
轉載自:http://www.cnblogs.com/feeland/ 我們經常會與檔案和目錄打交道,對於這些操作,python可以使用 os 及 shutill 模組,其中包含了很多操作檔案和目錄的函式。 os 可以執行簡單的資料夾及檔案操作,引入用 &n
虛擬機器與主機互相ping通且共享資料夾,且虛擬機器連線外網
在網上查詢了一天,感覺內容不是很完整,所以經過兩天無數次的失敗與摸索,終於完成了主機與虛擬機器互相ping通、共享資料夾且能連線外網,開心ing。虛擬機器版本為VirtualBox,linux版本為centos7。 1、虛擬機器與主機互相ping
在Ubuntu主機下實現與Windows虛擬機器共享資料夾
一.概述 由於要實現Ubuntu主機中的一些檔案與Windows虛擬機器共享,因此要建立一個共享資料夾對映到虛擬機器中. 網上許多都是Windows主機+Linux虛擬機器的配置,在此分享主機是Linux的. 主機:Ubuntu 桌面版18.04 虛擬機器:Virtual Box,Windows7
145_IO_File_常用方法_資料夾操作
常用方法_資料夾操作 Test04_DirMethod.java package _01.io.file; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays;
shell指令碼實現相關文字和資料夾操作
shell指令碼實現某些文字/檔案和資料夾功能. 資料在指令碼的上層資料夾Data內,在scripts資料夾內執行該指令碼,按格式得到需要的event.cat檔案. 在此做一記錄, 以便以後檢視. #!/bin/bash #以要求格式生成event.cat #在資料檔案上一級目錄的src
區域網下 ubuntu和windows 共享資料夾
前言:實驗室環境下,筆記本網線連線路由器,桌上型電腦無線連線同一路由器訊號,兩個在同一網段。 按照資料操作,兩者可互傳資料。 ubuntu為16.04LTS windows為win10 傳送門:https://blog.csdn.net/qq_1
Java使用SMBJ包從僅支援SMB2/SMB3協議的共享資料夾下載檔案
說明 之前整理了一篇jcifs不能用於SMB2/SMB3機器的解決方式,其中提到了將jcifs包替換為smbj的方式解決,給出的下載的demo中雖然可以正常列出共享資料夾中的檔案,但是具體怎樣將共享資料夾中的檔案下載到本地並沒有詳細說明,現在將下載程式碼貼出,因為github上的jar包沒有給出
VMware Workstation 共享資料夾 & 固定IP設定
共享資料夾 1.Path: 虛擬機器--->設定--->選項--->共享資料夾 2.開啟共享資料夾 3.Turn on Network 4.Map network drive 選擇共享的資料夾 固定IP設定 1.主機在Network
在Windows下訪問Ubuntu共享資料夾
1. Install samba >sudo apt-get install samba >sudo apt-get install smbclient 2. 修改配置檔案 >sudo vim /etc/samba/smb.conf
純淨版linux (debian)掛載VirtualBox共享資料夾 virtual box虛擬機器在linux下設定共享資料夾
使用的虛擬機器版本是:VirtualBox-5.2.8-121009 使用的linux版本是:Linux debian 4.9.0-7-amd64 tty 1. 開始配置 1.1:開啟虛擬機器設定,開啟你的VirtualBox軟體(主要先不要開啟linux系統)。選中你的虛擬機器後,
VMware中Linux虛擬機器掛載主機共享資料夾的方法
注意:要在主機與虛擬機器中設定共享資料夾,需要安裝VMware Tools或open-vm-tools工具。open-vm-tools可能不能自動掛載共享資料夾。自動掛載點是“/mnt/hgfs”。 1、進入VMware選單欄中的虛擬機器設定選項——共享資料夾設定中新增主機中用來給客戶機共享的目錄。
c# 資料夾操作
using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.IO; using System.Linq; using System.Reflecti