jcifs.smb.SmbException:访问被拒绝。 例外SMB目录(jcifs.smb.

2019-10-16 16:08发布

在下面的代码语句:

SmbFileInputStream din==new SmbFileInputStream(src);

我想创建一个SmbFileInputStream对象。 如果SmbFile“src”中是一个文件,但如果“src”中是一个SMB目录则抛出异常,这将正常工作:

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;

Answer 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
}


文章来源: jcifs.smb.SmbException: Access is Denied. exception for smb directories