有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javajcifs。中小企业。SMB异常:访问被拒绝。smb目录的例外情况

在下面的代码声明中:

SmbFileInputStream din==new SmbFileInputStream(src);

我正在尝试创建SmbFileInputStream对象。如果smb文件'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 安卓 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) 个答案

  1. # 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
    }