Bandeja de CD-ROM

bom dia galera. bom, eu era programador delphi e resolvi refazer tds os meus programas delphi utilizando a linguagem java! eu guardava sempre akeles programinhas q poderiam ser uteis em outras situações, como um q desligava o sistema… um q abria e fechava o drive de cd-rom…

SOBRE abrir e fechar o drive de cd-rom… alguem sabe como se faz? preciso saber q bibliotecas utilizar. sou iniciante java (2 semanas +/-). gostaria de ajuda nesse quesito. grande abraço a tds

11 visualizações, nenhuma resposta =[.

começo a imaginar q é impossivel ja q provavelmente a ação seja executada pelo s.o nativo e cada plataforma interprete isso de forma diferente. entaum acho q no java isso é impossivel. se eu estiver errado poste ai please ^^

[quote=Elizeu_Santos]11 visualizações, nenhuma resposta =[.

começo a imaginar q é impossivel ja q provavelmente a ação seja executada pelo s.o nativo e cada plataforma interprete isso de forma diferente. entaum acho q no java isso é impossivel. se eu estiver errado poste ai please ^^[/quote]

:lol:
Olha impossível não é, mas com java fazer isso nativamente não tem como, pelo menos eu não conheço, mas tem como fazer com C/C++ fazendo uma DLL que faz as chamadas ao SO e por sua vez o java através da api JNI chama a DLL ou com o “bom e velho” VBScript :? como segue.

Procurando no google achei alguns exemplos em VB e a partir deles fiz a classe abaixo, porém só funciona no Windows :roll: mas no Linux nada te impede de fazer com o “mount” e “eject”, fiz os teste aqui no “XPaus” com as 2 unidades que tenho e funcionou de boa.

Abraços!

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Fagner Granella
 */
public class JEjectDrive {

    // Array contendo as letras das unidades de CD/DVD
    private List<String> driver = new ArrayList<String>();

    /**
     *
     */
    public JEjectDrive() {
        this.getDriver();
    }

    /**
     * Método utilizado para executar os scripts em VB.
     * @param script Código em VB a ser executado.
     * @return Retorna toda a saída da execução.
     * @throws java.io.IOException
     */
    private String executeVBScript(String script) {
        String output = "";
        String line = null;

        try {
            File f = File.createTempFile("tmp", ".vbs");
            f.deleteOnExit();

            FileWriter fw = new FileWriter(f);
            fw.write(script);
            fw.close();

            Process p = Runtime.getRuntime().exec("cscript //NoLogo " + f.getPath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

            while ((line = input.readLine()) != null) {
                output += line;
            }

            input.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return output;
    }

    /**
     * Método para checar as unidades existentes.
     */
    private void getDriver() {
        StringBuilder sb = new StringBuilder();
        sb.append("Const DriveTypeCDROM = 4\n");
        sb.append("Set oFSO = Wscript.CreateObject(\"Scripting.FileSystemObject\")\n");
        sb.append("Set oDrives = oFSO.Drives\n");
        sb.append("For Each Drive in oDrives\n");
        sb.append("If Drive.DriveType = DriveTypeCDROM Then Wscript.Echo Drive.DriveLetter End If\n");
        sb.append("Next");

        String dr = executeVBScript(sb.toString());

        for (int i = 0; i < dr.length(); i++) {
            driver.add(dr.substring(i, i + 1));
        }
    }

    /**
     * Método para abrir/fechar a bandeja do CD/DVD com opção do usuário fecha-lá.
     * @param drv Letra da unidade para abrir.
     * @param msg Mensagem perguntando se quer fechar.
     * @param title Título da Mensagem.
     */
    public void eject(String drv, String msg, String title) {
        if (driver.contains(drv)) {
            StringBuilder sb = new StringBuilder();
            sb.append("Set oWMP = CreateObject(\"WMPlayer.OCX.7\")\n");
            sb.append("Set oCD = oWMP.CdromCollection.getByDriveSpecifier(\"");
            sb.append(drv);
            sb.append(":\\")\n");
            sb.append("oCD.Eject\n");

            if (msg != null && title != null) {
                sb.append("If vbOK = MsgBox(\"");
                sb.append(msg);
                sb.append("\", vbOKCancel, \"");
                sb.append(title);
                sb.append("\") Then\noCD.Eject\nEnd If");
            }

            String dr = executeVBScript(sb.toString());
        } else {
            throw new IllegalArgumentException("Unidade " + drv + " não encontrada");
        }
    }

    /**
     * Método para abrir/fechar a bandeja do CD/DVD.
     * @param drv Letra da unidade para abrir.
     */
    public void eject(String drv) {
        eject(drv, null, null);
    }

    /**
     * Método para abrir todas as bandejas de CD/DVD
     */
    public void ejectAll() {
        StringBuilder sb = new StringBuilder();
        sb.append("Set oWMP = CreateObject(\"WMPlayer.OCX.7\")\n");
        sb.append("Set oDrv = oWMP.CdromCollection\n");
        sb.append("If oDrv.Count >= 1 Then\n");
        sb.append("For i = 0 To oDrv.Count - 1\n");
        sb.append("oDrv.Item(i).Eject\n");
        sb.append("Next\nEnd If");

        String dr = executeVBScript(sb.toString());
    }

    /**
     *
     * @return Retorna as letras das unidades de CD/DVD
     */
    public String[] getDrivers() {
        return driver.toArray(new String[driver.size()]);
    }

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        JEjectDrive je = new JEjectDrive();

        for (String drv : je.getDrivers()) {
            System.out.println("Unidade encontrada: " + drv);
            je.eject(drv, "Deseja fechar a gaveta?", "CD/DVD");
        }

        je.ejectAll();
    }
}

Para minha solução de acesso remoto open-source “Satan-AnyWhere”, criei a biblioteca “SAW-NativeUtils”, para tentar prover algumas funcionalidades nativas na minha solução de acesso remoto.
Essa biblioteca pelo que me lembro tem meios para tentar abrir/fechar a bandeja de CD-ROM, e precisa da biblioteca JNA para funcionar.
Em teoria, a biblioteca que fiz funciona em Win32 (x86 32 & 64 bits), Linux (x86 32 & 64 bits), FreeBSD (x86 32 & 64 bits), Solaris (x86 32 & 64 bits, SPARC) e OpenBSD (x86 32 bits).

Para utilizar, basta chamar o método estático “initialize()” da classe “SAWNativeUtils” ao menos uma vez e depois é só usar os outros métodos estáticos da classe “SAWNativeUtils”.

Estou postando o binário e também o código fonte da biblioteca.

Inté.

Fiz um update na biblioteca SAW-NativeUtils.

KWill

por que não cria um repositorio opne source apra hospedar sua biblioteca?

Infelizmente Java não tem uma afinidade grande com SO.
E eu gostei da sugestão acima.

[quote=Felagund]KWill

por que não cria um repositorio opne source apra hospedar sua biblioteca?[/quote]

É por causa do esforço de botar o troço no java.net, sourcefourge, googlecode, configurar o projeto nesses hosts, etc. Aqui no GUJ é só botar um post e o troço já serve de repositório e de estande de exposição das minhas capacidades e esforços.

Inté.

[quote=KWill][quote=Felagund]KWill

por que não cria um repositorio opne source apra hospedar sua biblioteca?[/quote]

É por causa do esforço de botar o troço no java.net, sourcefourge, googlecode, configurar o projeto nesses hosts, etc. Aqui no GUJ é só botar um post e o troço já serve de repositório e de estande de exposição das minhas capacidades e esforços.

Inté.[/quote]

Usa o github, vc não tem o esforço de criar paginas não, pasta usar o git e colocar la, ja tem um repositorio, e vc pode gerenciar os releases.

[quote=KWill][quote=Felagund]KWill

por que não cria um repositorio opne source apra hospedar sua biblioteca?[/quote]

É por causa do esforço de botar o troço no java.net, sourcefourge, googlecode, configurar o projeto nesses hosts, etc. Aqui no GUJ é só botar um post e o troço já serve de repositório e de estande de exposição das minhas capacidades e esforços.

Inté.[/quote]
Talvez um repositório permitisse um avanço mais rápido, uma vez que teriam colaboradores (ou você prefere desenvolver sozinho?).

Você não criou um projeto no SF? Eu vi um chamado Satan-AnyWhere, mas não tinha nenhum arquivo no repositório. Para fazer um commit é rapidinho…

[quote=marcobiscaro2112]
Talvez um repositório permitisse um avanço mais rápido, uma vez que teriam colaboradores (ou você prefere desenvolver sozinho?).

Você não criou um projeto no SF? Eu vi um chamado Satan-AnyWhere, mas não tinha nenhum arquivo no repositório. Para fazer um commit é rapidinho…[/quote]

Criei o projeto no SF sim, mas não botei coisas lá ainda por sempre estar testando alguma coisa nova que eu achasse que deveria incluir antes de botar no sourceforge ou estou atolado em alguma coisa doida no trampo, fora que ainda não tenho um manual de uso em inglês, só em português.

Inté.

[quote=KWill][quote=marcobiscaro2112]
Talvez um repositório permitisse um avanço mais rápido, uma vez que teriam colaboradores (ou você prefere desenvolver sozinho?).

Você não criou um projeto no SF? Eu vi um chamado Satan-AnyWhere, mas não tinha nenhum arquivo no repositório. Para fazer um commit é rapidinho…[/quote]

Criei o projeto no SF sim, mas não botei coisas lá ainda por sempre estar testando alguma coisa nova que eu achasse que deveria incluir antes de botar no sourceforge ou estou atolado em alguma coisa doida no trampo, fora que ainda não tenho um manual de uso em inglês, só em português.

Inté.[/quote]
Mais um motivo para postar lá! O pessoal poderia contribuir com a tradução do manual/documentação.

[quote=marcobiscaro2112][quote=KWill][quote=marcobiscaro2112]
Talvez um repositório permitisse um avanço mais rápido, uma vez que teriam colaboradores (ou você prefere desenvolver sozinho?).

Você não criou um projeto no SF? Eu vi um chamado Satan-AnyWhere, mas não tinha nenhum arquivo no repositório. Para fazer um commit é rapidinho…[/quote]

Criei o projeto no SF sim, mas não botei coisas lá ainda por sempre estar testando alguma coisa nova que eu achasse que deveria incluir antes de botar no sourceforge ou estou atolado em alguma coisa doida no trampo, fora que ainda não tenho um manual de uso em inglês, só em português.

Inté.[/quote]
Mais um motivo para postar lá! O pessoal poderia contribuir com a tradução do manual/documentação.[/quote]
Calmaí, me deixa conseguir deixar estável a funcionalidade de sincronização de clipboard/área de transferência.

Inté.