質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

samba

Samba(サンバ)とは、UNIX系OSにおいてSMBを用いたサービスを提供するためのソフトウェアです。ネットワークを通じて、ファイル共有及びプリンタ共有などのサービスをWindowsマシンへと提供します。ライセンス体系GPLに基づきフリーソフトウェアとして公開されています。

Q&A

解決済

3回答

4618閲覧

sambaを利用して、ローカルドライブファイルをネットワークフォルダにコピーするには

kumakumatan

総合スコア213

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

samba

Samba(サンバ)とは、UNIX系OSにおいてSMBを用いたサービスを提供するためのソフトウェアです。ネットワークを通じて、ファイル共有及びプリンタ共有などのサービスをWindowsマシンへと提供します。ライセンス体系GPLに基づきフリーソフトウェアとして公開されています。

0グッド

0クリップ

投稿2019/01/10 09:15

java

1import java.io.*; 2 3import jcifs.smb.*; 4 5try { 6 7// コピー元ファイル取得 8String path = "c:\test\javac_tt.txt"; 9SmbFileInputStream sfis = new SmbFileInputStream(path); 10 11// コピー先ファイル 12SmbFileOutputStream sfos; 13sfos = new SmbFileOutputStream("smb://user:pass@111.11.11.111/test/java_test.txt"); 14 15PrintWriter pw = new PrintWriter(sfos); 16pw.println("SMBを使って、ファイルへと書き出します。"); 17pw.close(); 18 19} catch (Exception e) { 20 e.printStackTrace(); 21} 22

上記のソースにてネットワーク上のフォルダ(sambaにてユーザ・パスワード認証する)にテキストファイルを作成して、ファイルへ文字を書き出す事ができました。

こちらを応用して、コピー元ファイルのものをsambaのコピー先フォルダにコピーしたく思っています。

コピー元ファイル:"c:\test\javac_tt.txt";
コピー先フォルダ:111.11.11.111/test/

になります。
最終的にコピー完了したらコピー元ファイルは削除したく思っています。

こちらを実現するにはどのようにしたらよろしいでしょうか?

ご教授宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ご提示のコードの延長で、あくまでjcifs.smb.* クラス群を使ってsmbのアクセスをされたいのでのあれば、JCIFS - Java CIFS Client Library のリファレンスを確認しましょう。

SmbFile(JCIFS API)

ファイルコピーならjcifs.smb.SmbFile.copyToですし、ファイル削除ならjcifs.smb.SmbFile.deleteが使えるはずです。実例としては同サイトにサンプルプログラムが豊富にあるのでそちらを参考にされるのが良いと思います。
Index of /src/examples
コピーならCopyTo.javaでしょうし、削除ならDelete.java です。

※ところでご提示のソースは正しく動作したものでしょうか? こちらで試したところでは
String path = "c:\test\javac_tt.txt"のコードはエスケープ文字が正しくないのでコンパイルエラーとなり、更に
SmbFileInputStream sfis = new SmbFileInputStream(path);はWindowsのPATH文字列は受け付けず、jcifs.smb.SmbException例外が発生したのですが。。。


追記しました:2019-01-11 11:49

質問のタイトルとご提示のコードの内容、コメントから推察するに、少し混乱があるようです。

  1. Samba - Windowsのネットワークファイル共有を実現する、unix系OS上で動くプログラム(製品)の名前です。

通信プロトコルとしてSMB(Server Message Block)を使い、WindowsとUnix系OS間でファイル等の共有を行っています。

  1. JCIFS - SMBでWindowsファイル共有サービスを利用できるようCIFSの機能をサポートするJavaのライブラリです。

ですので、Windowsマシン間のファイル共有と言うことでしたらSambaはとりあえず関係ありません。


追記しました2:2019-01-11 12:50

SmbFile.copyToはリモートのファイル同士しかコピーできないので、コピー元やコピー先がローカルのファイルの場合は例えばFileInputStreamFileOutputStremを使って自力でコピーする必要があるようです。ローカルのファイルをリモートにコピーする例を示します。コードはあえて冗長に書いてるところもありますのであくまで参考程度としてください。

Java

1private void copy3() { 2 //String localPath = "D:\project\src.txt"; 3 // PATH区切り文字としてエスケープが必要な'\'ではなく、'/'でもOK 4 String localPath = "D:/project/src.txt"; 5 String remotePath = "smb://user:password@192.168.11.101/temp/dest.txt"; 6 7 try { 8 FileInputStream ifs = new FileInputStream(localPath); 9 SmbFile dst = new SmbFile(remotePath); 10 SmbFileOutputStream ofs = new SmbFileOutputStream(dst); 11 12 byte[] data = new byte[1024]; 13 for (;;) { 14 int len = ifs.read(data); 15 if (len == -1) { 16 break; 17 } 18 ofs.write(data, 0, len); 19 } 20 ifs.close(); 21 ofs.close(); 22 23 } catch (Exception e) { 24 e.printStackTrace(); 25 } 26}

投稿2019/01/10 12:28

編集2019/01/11 03:51
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2019/01/11 00:28

ご回答ありがとうございます。 String path = "c:\test\javac_tt.txt" の箇所を外すと、うまくいきます。 "\test\javac_tt.txt" と「c:」が消えているようです。 どうすれば、消えないでしょうか? ご教授宜しくお願いします。
dodox86

2019/01/11 02:25

> の箇所を外すと、うまくいきます。 ?外してはコードの意味が無いのでは?と思いましたが、そもそも使っていないコードだったのですね。 そのあたりは質問内容から離れて、Javaの話になってしまうのですが。 \文字はエスケープしなければいけないので、 "c:\test\javac_tt.txt"とのようになります。 https://www.javadrive.jp/start/num/index4.html ただ、回答にも書きましたがSmbFileInputStreamのコンストラクターはそのPATH文字列を受け付けません。
kumakumatan

2019/01/11 02:38

ご回答ありがとうございます。 sambaファイル同士のコピーなどは 「コピー元.copyTo(コピー先)」にてできるのはわかったのですが、 コピー元が「c:\test\javac_tt.txt」の場合、どのようにしたらよいのか わからなく、ご教授していただきたく思います。 宜しくお願いします。
dodox86

2019/01/11 03:51

サンプルコードを追記しましたので参考にしてみてください。
kumakumatan

2019/01/11 05:02 編集

ありがとうございます。コピー出来ました! サンプルコードの 「byte[] data = new byte[1024];」 はどのような意味になりますでしょうか? また、「ofs.write(data, 0, len);」 なのですがここの(data, 0, len)の引数について教えていただきたく思います。 または、どこか参考になるサイトなどがありましたら教えていただきたく思います。 また、既にファイルがある場合はどうなりますでしょうか? 宜しくお願いします。
dodox86

2019/01/11 05:07

もし、Javaのプログラミング自体に慣れておられないようであればまずはチュートリアル等をひととおりやって基本的な部分を習得しましょう。byte[] data = new byte[1024]; は1024個のbyte配列を用意する、です。1024バイトの読み込みバッファを用意するとの意味になります。ofs.write(data, 0, len)はリファレンスである https://docs.oracle.com/javase/jp/6/api/java/io/FileOutputStream.html#write(byte[],%20int,%20int) を参照してください。その他、ストリームの基本的な使い方は以下など https://docs.oracle.com/cd/E26537_01/tutorial/essential/io/bytestreams.html いずれも基本的な部分と言えます。
kumakumatan

2019/01/11 05:13

ありがとうございました。 これから勉強していきます。
dodox86

2019/01/11 12:54 編集

すみません、ひとつ訂正です。 > ofs.write(data, 0, len)はリファレンスである SmbFileOutputStream.writeのリファレンスはこちらでした。 https://www.jcifs.org/src/docs/api/ (まぁ、FileOutputStream.writeと引数の意味は同じですが)
guest

0

ユーザー名を明示的に指定してファイル共有フォルダを開く

netコマンドを用いることでユーザーを指定して共有フォルダにアクセスすることができます。

コマンドプロンプトで下記のコマンドを実行します。
net use (サーバー名) /user:(ユーザー名) (パスワード)

投稿2019/01/10 10:43

編集2019/01/10 10:45
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2019/01/11 00:22

ご回答ありがとうございます。 こちらの場合、既に、接続セッションがある場合、エラーとして例外処理 が発生してしまうでしょうか? ご教授宜しくお願いします。
y_waiwai

2019/01/11 00:30

javaで実行するなら別プロセスでの実行になるんで、エラーが出るならERRORLEVELで戻ってくるテでしょうね
guest

0

WinからUnixへのコピーですよね?

「\111.11.11.111\test\ 」にコピーできませんか?

投稿2019/01/10 09:45

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2019/01/10 10:06

コピー元もコピー先もwindowsです。コピー先フォルダはユーザー、パスワード認証があります。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問