介紹
我們習慣于使用共享文件,其中共享僅限于某些域中的用戶或某些用戶。遠程應用程序需要訪問共享資源并在共享位置執(zhí)行添加、刪除資源等操作。
服務器具有共享資源,這些資源通常在 Windows 機器中使用服務器消息塊 (SMB) 協(xié)議 ( Server Message Block )。SMB 協(xié)議使應用程序能夠訪問遠程服務器上的文件,以及允許客戶端應用程序打開、讀取、移動、更新遠程服務器上的文件的其他資源。該資源僅限于某些用戶。用戶需要傳遞憑據(jù)才能訪問共享資源。用戶可以在共享資源上進行的活動在共享權限中定義。讓我們假設用戶具有讀和寫權限。
在本文中,我將為大家演示一個例子,其中應用程序需要使用一個簡單的 Java 應用程序與 Windows 服務器計算機中的共享文件進行交互。用例做出以下假設:
- 服務器是一臺 Windows 機器。
- 存在名為“ ?
Test
?”的本地用戶,該用戶的密碼為“ ?Password
?”。 - 共享位置是“ 127.0.0.0.1\temp ”。
- 用戶“ ?
Test
?”有權訪問共享位置“ temp ”,該位置可以位于 IP 為“ ?127.0.0.1
?”的計算機中的任何位置。 - 客戶端應用程序可以訪問網絡。
代碼庫
我們正在設計的應用程序是在 Java 中使用 Maven 進行構建和依賴項管理。我正在使用 JCIFS,這是一個實現(xiàn)CIFS/SMB 網絡協(xié)議的開源客戶端庫。該庫可從 Maven Repository 獲得。
依賴關系顯示在以下pom.xml文件中:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fileShare</groupId>
<artifactId>fileShare</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.17</version>
</dependency>
</dependencies>
</project>
目前,該應用程序有一個文件Main.java,內容如下:
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import java.net.MalformedURLException;
public class Main {
public static void main(String[] args) {
String url = "smb://127.0.0.1/test/";
String userName = "test";
String password = "password";
String domain = null;
NtlmPasswordAuthentication auth =
new NtlmPasswordAuthentication(null, userName, password);
try {
doRecursiveLookup(new SmbFile(url, auth));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
/*
* Recursively scans through the folder for files and prints the name of folder and file
*/
public static void doRecursiveLookup(SmbFile smb) {
try {
if (smb.isDirectory()) {
System.out.println(smb.getName());
for (SmbFile f : smb.listFiles()) {
if (f.isDirectory()) {
doRecursiveLookup(f);
} else {
System.out.println("\t:" + f.getName());
}
}
} else {
System.out.println("\t:" + smb.getName());
}
} catch (SmbException e) {
e.printStackTrace();
}
}
}
這里,main方法使用for smb協(xié)議的url模式,并在第8行指向共享位置。局部變量for ?userName,password
?和?domains
?在第9到11行初始化,并在第13行驗證用戶,此時應用程序已成功連接到共享文件夾。
應用程序?SmbFile
?在第 15 行創(chuàng)建一個對象并將該文件夾傳遞給?doRecursiveLookup(..)
?第 24 行調用的方法。該方法簡單地遍歷共享位置中的所有文件和文件夾,并以遞歸方式在控制臺中打印名稱。請注意,?SmbFile
?文件或文件夾的對象是相同的,并且?.isDirectory()
?方法用于測試范圍內的對象是文件還是文件夾。