jcifs.smb.SmbException: Access is Denied. exception for smb directories

若如初见. 提交于 2019-12-13 00:12:07

问题


In the below code statement:

SmbFileInputStream din==new SmbFileInputStream(src);

I am trying to create a SmbFileInputStream object. This will works fine if SmbFile 'src' is a file, but if 'src' is a smb Directory then it throws exception:

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)

What is wrong with this code? or where am I going wrong?

Hi please check this code:

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:


You can't create an SmbFileInputStream for a directory, because you can't read/write directly to the directory object. A directory doesn't have any content, at least not in the same way that a file has content.

If you're trying to read the contents of a directory, you should probably be using SmbFile instead (for example, use the listFiles() method). The SmbFileInputStream object is only for reading information from a file.

To write a file to a directory, do this...

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(...);

In your code, change the following few lines...

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

To this...

   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)

Also change the following...

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
}


来源:https://stackoverflow.com/questions/10433119/jcifs-smb-smbexception-access-is-denied-exception-for-smb-directories

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!