jcifs.smb.SmbException: acceso denegado. excepción para directorios smb

En la siguiente declaración de código:

SmbFileInputStream din==new SmbFileInputStream(src);

Estoy tratando de crear un objeto SmbFileInputStream. Esto funcionará bien si SmbFile 'src' es un archivo, pero si 'src' es un directorio smb, arroja una excepción:

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)

¿Qué está mal con este código? o donde me estoy equivocando?

hola revisa este codigo:

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;

preguntado el 03 de mayo de 12 a las 15:05

1 Respuestas

No puedes crear un SmbFileInputStream para un directorio, porque no puede leer/escribir directamente en el objeto de directorio. Un directorio no tiene ningún contenido, al menos no de la misma manera que un archivo tiene contenido.

Si está tratando de leer el contenido de un directorio, probablemente debería estar usando SmbFile en su lugar (por ejemplo, utilice el listFiles() método). El SmbFileInputStream El objeto es solo para leer información de un archivo.

Para escribir un archivo en un directorio, haga esto...

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

En su código, cambie las siguientes líneas...

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

A esto...

   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)

También cambia lo siguiente...

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
}

contestado el 04 de mayo de 12 a las 04:05

Entonces, ¿cómo puedo copiar directorios a la tarjeta SD de mi teléfono Android? Porque si uso el método copyTo() de la clase SmbFile en el paquete jcifs, no puedo crear el archivo de destino de Android (es decir, "/mnt/sdcard/") como objeto smbFile. Entonces, ¿cómo implementar la copia de directorios? - RAM

Primero necesitaría crear todos los directorios usando new SmbFile(file).mkdirs(), luego abra un SmbFileInputStream para escribir el archivo en él. Ver mi código editado. - wattostudios

Oye, ¿necesito crear directorios en la tarjeta SD? becos antes de usar FileOutputStream para escribir en la tarjeta SD, se lanza la excepción anterior ... - RAM

Sí, deberá crear los directorios antes de poder escribir archivos en ellos. Si está tratando de usar clases de archivo normales como FileOutputStream, puedes usar new File(filename).mkdirs() antes de FileOutputStream para crear todos los directorios de destino también. He editado mi respuesta nuevamente para usar esto en su lugar. - wattostudios

Hola WATTO, vea "Hola, verifique este código:" arriba y dígame dónde debo agregar su explicación ... o edite mi código si es posible ... - RAM

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.