2012-05-03 5 views
1

В приведенном ниже коде заявление:jcifs.smb.SmbException: доступ запрещен. исключение для кого-л каталогов

SmbFileInputStream din==new SmbFileInputStream(src); 

Я пытаюсь создать объект SmbFileInputStream. Это будет работать хорошо, если SmbFile «ЦСИ» является файлом, но если «ЦСИ» является каталог СМБ, то он бросает исключение:

jcifs.smb.SmbException: Access is Denied. 
at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:622) 
at jcifs.smb.SmbTransport.send(SmbTransport.java:722) 
at jcifs.smb.SmbSession.send(SmbSession.java:262) 
at jcifs.smb.SmbTree.send(SmbTree.java:119) 
at jcifs.smb.SmbFile.send(SmbFile.java:785) 
at jcifs.smb.SmbFile.open0(SmbFile.java:1009) 
at jcifs.smb.SmbFile.open(SmbFile.java:1026) 
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73) 
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:65) 
at testhelp.main(testhelp.java:25) 

Что не так с этим кодом? или где я иду не так?

Привет, пожалуйста, проверьте этот код:

case DOWNLOAD2: 

/*This code snippet is used to download a file/folder from smb nETWORK to android sd card. 
when I run this code its throwing some exception. It have commented where ever necessary. rest of the code is self 
explanatory. So please go through the code and please tell why this exception is thrown. 
IF POSSIBLE PLEASE ADD A PROGRESS BAR WHICH SHOULD HELP USER SAYING SOME WORK IS GOING ON. 
I have tried including a progress bar, but its not working. I ve read some materials related to this, 
but every thing makes use threads. I am not that good at threads. So is it possible to include a progess bar, 
without using threads?If possible please help me to do it. 
And this code is working file for smb files, I dont know why its throwing exception in case of directories. 
Please see why this is throwing exception.. 
So please see that the modified code contains: 
a)no exceptions 
b)a progress bar(more specifically a horizontal bar)*/ 

/*exception thrown: 
jcifs.smb.SmbException: Access is Denied. 
at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:622) 
at jcifs.smb.SmbTransport.send(SmbTransport.java:722) 
at jcifs.smb.SmbSession.send(SmbSession.java:262) 
at jcifs.smb.SmbTree.send(SmbTree.java:119) 
at jcifs.smb.SmbFile.send(SmbFile.java:785) 
at jcifs.smb.SmbFile.open0(SmbFile.java:1009) 
at jcifs.smb.SmbFile.open(SmbFile.java:1026) 
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73) 
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:65) 
at testhelp.main(testhelp.java:25)*/ 


StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath()); 
//if sd card is mounted then only this operation occur: 
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 
{ 
    //object.getCount() gets the number of objects in list view 
    for(int i=0;i<object.getCount();i++) 
    { 
     //for each object in list view, if it is checked: 
     if(object.getter(i)==true) 
     { 
      SmbFileInputStream din=null; 
      FileOutputStream dout=null; 
      try 
      { 
       //I have used a hash table, which maps list view name with smb object 
       SmbFile src=map.get(object.getItem(i)); 
       long blockSize = statFs.getBlockSize(); 
       long freeSize = statFs.getFreeBlocks()*blockSize; 
       long diff=freeSize-src.length(); 
       boolean can=false; 
       if(!(diff<0)) 
       { 
        can=true; 
       } 
       if(!src.isHidden() && can) 
       { 
        try 
        { 
         if(src.isFile()) 
         { 
          din=new SmbFileInputStream(src); 
          dout=new FileOutputStream(Environment.getExternalStorageDirectory()+"/"+src.getName()); 
         } 
         else 
         { 
          din=new SmbFileInputStream(src); 
          File outputFile = new File(Environment.getExternalStorageDirectory()+"/"+src.getName()); // ADDED 
          outputFile.mkdirs(); // ADDED 
          dout=new FileOutputStream(outputFile); // CHANGED 
         } 
         int c; 
         while((c=din.read())!=-1) 
         { 
          dout.write(c); 
         } 
        } 
        finally 
        { 
         if (din != null) 
         { 
          din.close(); 
         } 
         if (dout != null) 
         { 
          dout.close(); 
         } 
        } 
       } 
       else 
       { 
        Toast.makeText(this,src.getName()+" cannot be downloaded",Toast.LENGTH_LONG).show(); 
       } 
      } 
      catch(IOException e) 
      { 
       Toast.makeText(this,"DOWNLOAD FAILED--IO EXCEPTION\n"+e,Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
} 
else 
{ 
    Toast.makeText(this,"DOWNLOAD FAILED--NO SD CARD FOUND",Toast.LENGTH_LONG).show(); 
} 
return true; 

ответ

1

Вы не можете создать SmbFileInputStream для каталога, потому что вы не можете читать/писать непосредственно на объект каталога. В директории нет содержимого, по крайней мере, не таким образом, что файл имеет контент.

Если вы пытаетесь прочитать содержимое каталога, скорее всего, вы должны использовать SmbFile (например, используйте метод listFiles()). Объект SmbFileInputStream предназначен только для чтения информации из файла.

Чтобы записать файл в каталог, сделайте это ...

File file = new File("/mnt/sdcard/filename.txt"); 
file.mkdirs(); // this creates all the directories that are missing 
FileOutputStream os = new FileOutputStream (file); 
// now write the file data 
os.write(...); 

В коде, измените следующие несколько строк ...

try 
    { 
    din=new SmbFileInputStream(src); 
    dout=new FileOutputStream(Environment.getExternalStorageDirectory()+"/"+src.getName()); 
    int c; 
    while((c=din.read())!=-1) 

К этому ...

try 
    { 
    din=new SmbFileInputStream(src); 

    File outputFile = new File(Environment.getExternalStorageDirectory()+"/"+src.getName()); // ADDED 
    outputFile.mkdirs(); // ADDED 

    dout=new FileOutputStream(outputFile); // CHANGED 
    int c; 
    while((c=din.read())!=-1) 

изменить также следующие ...

if(src.isFile()){ 
    din=new SmbFileInputStream(src); 
    //dout=new FileOutputStream(Environment.getExternalStorageDirectory()+"/"+src.getName());// REMOVE THIS LINE 
    File outputFile = new File(Environment.getExternalStorageDirectory()+"/"+src.getName()); // ADDED 
    outputFile.mkdirs(); // ADDED 
    dout=new FileOutputStream(outputFile); // ADDED 
} 
else { 
    //din=new SmbFileInputStream(src); // REMOVE THIS LINE 
    File outputFile = new File(Environment.getExternalStorageDirectory()+"/"+src.getName()); 
    outputFile.mkdirs(); 
    //dout=new FileOutputStream(outputFile); // REMOVE THIS LINE 
} 
+0

Тогда как я могу скопировать каталоги на SD-карту моего телефона Android? Поскольку, если я использую метод copyTo() класса SmbFile в пакете jcifs, я не могу создать целевой файл Android (то есть «/ mnt/sdcard /») как объект smbFile. Итак, как реализовать копирование каталогов? – ram

+0

Вам нужно будет создать все каталоги сначала, используя 'новый SmbFile (файл) .mkdirs()', затем откройте 'SmbFileInputStream', чтобы записать файл в него. См. Мой отредактированный код. – wattostudios

+0

Эй, мне нужно создавать каталоги на SD-карте? becos, прежде чем я буду использовать FileOutputStream для записи на SD-карту, вышесказанное исключено. – ram