ディレクトリの表示

373 views
Skip to first unread message

ion1031

unread,
Feb 6, 2014, 9:07:42 PM2/6/14
to android-g...@googlegroups.com
おはようございます。
少し前にもお世話になりましたが、投稿失礼します。
WindowsServerPCで共有設定をしているファイルをAndroidにもってくるプログラムを組んでいるのですが、
ファイル(Word形式やExcel、テキスト)などはSmbFileInputStreamで取得でき、無事Android端末のSDに
生成できたのですが、同じ場所にあるディレクトリがSmbFileInputStreamにはいるとAccess is deniedと
LogCatに出力されます。ディレクトリなのでいかんのかな?と思いファイルとディレクトリを判断するif文で
ファイルのときはSmbFileInputStreamで取得、ディレクトリの場合何もしない、という動作に今はしています。

ディレクトリの取得はなにか違うコードが用意されているのでしょうか?
それとも私のSmbFileInputStreamの使い方がおかしいのでしょうか?
初歩的な質問なのかどうかもわからないですが、ご教授願いたく思います。

ソースコード一部

------------------------------------------------------------------------------------------------------------------------------------------------

try {
        SmbFile file = new SmbFile(パス);
        mame = file;
        final SmbFile [] files = file.listFiles();
        filenames = file.list();
        for (int i = 0; i < filenames.length; i++) {
           System.out.println(filenames[i]);
             if (files[i].isFile()){
               // ファイルだった時の処理
             //取得元ファイル取得
                 SmbFileInputStream bfIs = new SmbFileInputStream(パス + filenames[i]);
                 InputStreamReader bfIn = new InputStreamReader(bfIs,"UTF-8");
               BufferedReader brInFile  = new BufferedReader(bfIn);
                
                 //ここまでファイル読み込み
                
                 // 取得先フォルダ存在チェック
                File dirTo = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
                 if (!dirTo.exists()) {
               // 取得先フォルダが存在しない場合、作成する。
               dirTo.mkdirs();
                 }
                
                 // 取得先ファイル生成
                 FileOutputStream outIs = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + filenames[i]);
                 OutputStreamWriter outIn = new OutputStreamWriter(outIs,"UTF-8");
               PrintWriter    pwOutFile = new PrintWriter(new BufferedWriter(outIn));
             
                 // 読み込み処理
                 String  strBuff;
                 while((strBuff = brInFile.readLine()) != null) {
                 pwOutFile.println(strBuff);
                 }
                 // クローズ処理
                 brInFile.close();
                 pwOutFile.close();
             }else if (files[i].isDirectory()){
               // ディレクトリだった時の処理
             
             }
           t = i;
        }
        for (SmbFile f : files) {
            String name = f.getName(); // ファイル(ディレクトリ)名のみ
            String uncPath = f.getUncPath(); // UNCパス。
            String smbPath = f.getPath(); // SMB URL。
            System.out.println(name);
            System.out.println(uncPath);
            System.out.println(smbPath);
           
        }
    } catch (Exception e ) {
        e.printStackTrace();
    }

noxi

unread,
Feb 6, 2014, 10:46:52 PM2/6/14
to android-g...@googlegroups.com
noxiです。

SmbFile#listFiles使えば良いのでは?
これで子ファイルが取得出来るならば、あとは再帰的に処理を行うだけです。


2014年2月7日 11:07 ion1031 <ion.nice...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

Shinichi Arata

unread,
Feb 6, 2014, 10:53:43 PM2/6/14
to android-g...@googlegroups.com
かっぱ大王です。

ディレクトリだったらディレクトリをサーバー側に作り(SmbFile#mkdir)、後は
noxiさんの仰る通り、再帰的にファイルを作成していけばいいかと
思います。

参考になれば、幸いです。


2014年2月7日 12:46 noxi <android.w...@gmail.com>:

ion1031

unread,
Feb 7, 2014, 2:40:37 AM2/7/14
to android-g...@googlegroups.com
noxi様、かっぱ大王様。
返信ありがとうございます。

理解力に乏しく申し訳ないのですが、よくわからずアドバイスを噛み砕きご教授していただけませんか。
申し訳ございません。

2014年2月7日金曜日 11時07分42秒 UTC+9 ion1031:

Shinichi Arata

unread,
Feb 7, 2014, 4:44:20 PM2/7/14
to android-g...@googlegroups.com
かっぱ大王です。

WIndowsやAndroid(Linux)では階層構造によってファイルやディレクトリを管理しています。

そのため、特定のディレクトリの中を見た時に、ファイルだけではなく
ディレクトリが入っている場合もあります。

ディレクトリの中にディレクトリが入っていて、かつその階層の数も任意の数に決められます。

例えば、写真を格納するpictureディレクトリに中に日付のディレクトリが入っていて
その中に写真を入れたりすることはあるかと思います。

プログラムで、ファイルを走査する場合には、ディレクトリの中にディレクトリが
入っていることも考慮しないといけません。

その場合に、その数がわからない、場合によっては変わりうるということが問題に
なります。

例えば、ディレクトリの階層の数を規定してプログラムを書いてしまうと、階層が
増えた場合には対応できません。

そういった時に使用するのが再帰処理になります。

ググって最初の方に出てきたファイル操作の再帰処理のサイトです。


なんとなくイメージできるのではないでしょうか。

# 何がわからないかを明確になると、回答する方も回答しやすくなるかも知れません

参考になりましたら、幸いです。

ion1031

unread,
Feb 7, 2014, 7:01:24 PM2/7/14
to android-g...@googlegroups.com
おはようございます。
細かく教えていただきありがとうございます。
# 何がわからないかを明確になると、回答する方も回答しやすくなるかも知れません
まさにその通りでした。質問する側の立場なのに、質問がなってないものでした。
申し訳ありません。
次回質問を投稿するときは、もっとわからないことを明確に伝えるようにいたします。
細かく教えていただいたおかげでイメージすることができました。
さっそく取り組んでみます。

2014年2月8日土曜日 6時44分20秒 UTC+9 かっぱ大王:
Message has been deleted

Shin Miyazaki

unread,
Feb 13, 2014, 1:52:02 AM2/13/14
to android-g...@googlegroups.com
こんにちは、みやざきです

・ExcelやWordのファイル(その他PDFや音声、写真、映像等)はテキストファイルでは無いということ。
・InputStreamReaderやOutputStreamReaderというクラスはどういう働きをするクラスであり、今回のような場合に使用することが適切であるか。



2014年2月13日 15:27 ion1031 <ion.nice...@gmail.com>:
こんにちは。
ディレクトリとその中にあるテキストファイルの表示などは
皆さんのアドバイスのおかげでAndroid端末の中にコピーすることができました。
ありがとうございました。
ですが、また新たな問題が起こりましてテキストファイルは開けるものの
WordやExcelのファイルを開くことができません。
ファイルのバージョンも見ることのできるもので、元ファイルをはじめからAndroidで見ると閲覧できます。
しかし自作したアプリでコピーしできたファイルは形はできていますが、開こうとすると「有効なファイルではありません」と表示されてしまいます。
ちなみに既存のESファイルエクスプローラでコピーされたWordファイルは見ることができました。
画像ファイルはデータが破損されていて表示できませんと表示されるのでファイルを全部取得しきれずに
次の動作や動作を終了してしまっているのか?と思ったりもしています。
なにか作る場合に条件があるのか?とも思ったりしています。
が、どうしてこうなってしまっているのか分かりません・・お答えできましたらよろしくお願いします。

ソースコード
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  public void readFolder(SmbFile  file) {
      try{
        SmbFile [] files = file.listFiles();
        if( files == null )
          return;
        for( SmbFile f : files ) {
            Log.d("test",f.getPath());
            Log.d("test",f.getName());
            Log.d("test",f.getParent( ));
            if( !f.exists() )
                return;
            else if( f.isDirectory() ){
                oya = f.getPath();
                path2 = oya.substring(kijun.length());
                File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + path2);
                dir.mkdir();
                readFolder(f);
            }else if( f.isFile() ){
                path1 = f.getParent().substring(kijun.length());
                execute(f , path1);

            }
        }
      } catch (Exception e ) {
            e.printStackTrace();
      }
  }
  public void execute( SmbFile f , String path) {
        // ここにやりたい処理を書く
        //System.out.println( f.getPath() );
        try {
      //取得元ファイル取得
        SmbFileInputStream bfIs = new SmbFileInputStream(f.getPath());

        InputStreamReader bfIn = new InputStreamReader(bfIs,"UTF-8");
        BufferedReader brInFile  = new BufferedReader(bfIn);
           //ここまでファイル読み込みサンプル
          
        // 取得先ファイル生成
        FileOutputStream outIs = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +  path  + f.getName());

       
        OutputStreamWriter outIn = new OutputStreamWriter(outIs,"UTF-8");
       
           PrintWriter    pwOutFile = new PrintWriter(new BufferedWriter(outIn));
    
           // 読み込み処理
           String  strBuff;
           while((strBuff = brInFile.readLine()) != null) {
            pwOutFile.println(strBuff);
           }
           // クローズ処理
           brInFile.close();
           pwOutFile.close();
        } catch (Exception e ) {
            e.printStackTrace();
        }
      }
  @Override
 
  protected Long doInBackground(String... params) {
    Log.d(TAG, "doInBackground - " + params[0]);
    try {
        kijun = "smb://" + AsyncTest.name1 + ":" + AsyncTest.password1 + "@10.32.2.1/utukemono/";
        SmbFile file = new SmbFile("smb://" + AsyncTest.name1 + ":" + AsyncTest.password1 + "@10.32.2.1/utukemono/");

        mame = file;
        final SmbFile [] files = file.listFiles();
        filenames = file.list();
        readFolder(file);
        for (SmbFile f : files) {
            String smbPath = f.getPath(); // SMB URL。※※アカウント情報含んだSMB URLを指定した場合、それらも含まれるので表示には注意※※

            System.out.println(smbPath);
        }
    } catch (Exception e ) {
        e.printStackTrace();
    }
    return 123L;
  }

2014年2月7日金曜日 11時07分42秒 UTC+9 ion1031:

--

ion1031

unread,
Feb 13, 2014, 2:18:09 AM2/13/14
to android-g...@googlegroups.com
申し訳ありません。いたらない情報までのせておりましたので
再度投稿いたします。
      } catch (Exception e ) {
            e.printStackTrace();
      }
  }
  public void execute( SmbFile f , String path) {
        // ここにやりたい処理を書く
        //System.out.println( f.getPath() );
        try {
      //取得元ファイル取得
        SmbFileInputStream bfIs = new SmbFileInputStream(f.getPath());


        InputStreamReader bfIn = new InputStreamReader(bfIs,"UTF-8");
        BufferedReader brInFile  = new BufferedReader(bfIn);
           //ここまでファイル読み込みサンプル
         
        // 取得先ファイル生成
        FileOutputStream outIs = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +  path  + f.getName());


      
        OutputStreamWriter outIn = new OutputStreamWriter(outIs,"UTF-8");
      
           PrintWriter    pwOutFile = new PrintWriter(new BufferedWriter(outIn));
   
           // 読み込み処理
           String  strBuff;
           while((strBuff = brInFile.readLine()) != null) {
            pwOutFile.println(strBuff);
           }
           // クローズ処理
           brInFile.close();
           pwOutFile.close();
        } catch (Exception e ) {
            e.printStackTrace();
        }
      }
  @Override
 
  protected Long doInBackground(String... params) {
    Log.d(TAG, "doInBackground - " + params[0]);
    try {
        kijun = "smb://" + AsyncTest.name1 + ":" + AsyncTest.password1 + "@IPアドレス/F/";
        SmbFile file = new SmbFile("smb://" + AsyncTest.name1 + ":" + AsyncTest.password1 + "@IPアドレス/F/");


        mame = file;
        final SmbFile [] files = file.listFiles();
        filenames = file.list();
        readFolder(file);
        for (SmbFile f : files) {
            String smbPath = f.getPath(); // SMB URL。※※アカウント情報含んだSMB URLを指定した場合、それらも含まれるので表示には注意※※


            System.out.println(smbPath);
        }
    } catch (Exception e ) {
        e.printStackTrace();
    }
    return 123L;
  }

2014年2月7日金曜日 11時07分42秒 UTC+9 ion1031:
おはようございます。

ion1031

unread,
Feb 13, 2014, 2:39:44 AM2/13/14
to android-g...@googlegroups.com
ありがとうございます!!!
的確な指摘というか、そもそもの凡ミスお恥ずかしい限りです。
すぐに修正いたします。。
ありがとうございます。

2014年2月13日木曜日 15時52分02秒 UTC+9 shinm:
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
Reply all
Reply to author
Forward
0 new messages