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

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

ただいまの
回答率

90.42%

  • Java

    14754questions

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

  • samba

    60questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 103

kumakumatan

score 137

import java.io.*;

import jcifs.smb.*;

try {

// コピー元ファイル取得
String path = "c:\test\javac_tt.txt";
SmbFileInputStream sfis = new SmbFileInputStream(path);

// コピー先ファイル
SmbFileOutputStream sfos;
sfos = new SmbFileOutputStream("smb://user:pass@111.11.11.111/test/java_test.txt");

PrintWriter pw = new PrintWriter(sfos);
pw.println("SMBを使って、ファイルへと書き出します。");
pw.close();

} catch (Exception e) {
               e.printStackTrace();
}


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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

ご提示のコードの延長で、あくまで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間でファイル等の共有を行っています。

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

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


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

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

private void copy3() {
    //String localPath = "D:\\project\\src.txt";
    // PATH区切り文字としてエスケープが必要な'\\'ではなく、'/'でもOK
    String localPath = "D:/project/src.txt";
    String remotePath = "smb://user:password@192.168.11.101/temp/dest.txt";

    try {
        FileInputStream ifs = new FileInputStream(localPath);
        SmbFile dst = new SmbFile(remotePath);
        SmbFileOutputStream ofs = new SmbFileOutputStream(dst);

        byte[] data = new byte[1024];  
        for (;;) {
            int len = ifs.read(data);
            if (len == -1) {
                break;
            }
            ofs.write(data, 0, len);
        }
        ifs.close();
        ofs.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/11 09:28

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

    キャンセル

  • 2019/01/11 11:25

    > の箇所を外すと、うまくいきます。
    ?外してはコードの意味が無いのでは?と思いましたが、そもそも使っていないコードだったのですね。

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

    キャンセル

  • 2019/01/11 11:38

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

    キャンセル

  • 2019/01/11 11:52

    ローカルのファイルなら FileInputStream などを組み合わせて使えばいいと思います。 https://docs.oracle.com/javase/jp/7/api/java/io/FileInputStream.html

    キャンセル

  • 2019/01/11 12:51

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

    キャンセル

  • 2019/01/11 13:58 編集

    ありがとうございます。コピー出来ました!
    サンプルコードの
    「byte[] data = new byte[1024];」
    はどのような意味になりますでしょうか?

    また、「ofs.write(data, 0, len);」
    なのですがここの(data, 0, len)の引数について教えていただきたく思います。
    または、どこか参考になるサイトなどがありましたら教えていただきたく思います。

    また、既にファイルがある場合はどうなりますでしょうか?

    宜しくお願いします。

    キャンセル

  • 2019/01/11 14: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
    いずれも基本的な部分と言えます。

    キャンセル

  • 2019/01/11 14:13

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

    キャンセル

  • 2019/01/11 21:53 編集

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

    キャンセル

+1

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

netコマンドを用いることでユーザーを指定して共有フォルダにアクセスすることができます。
コマンドプロンプトで下記のコマンドを実行します。
net use \\(サーバー名) /user:(ユーザー名) (パスワード) 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/11 09:22

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

    キャンセル

  • 2019/01/11 09:30

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/10 19:06

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

    キャンセル

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

  • ただいまの回答率 90.42%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14754questions

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

  • samba

    60questions

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