Получить абсолютный путь к рабочему столу - PullRequest
1 голос
/ 02 апреля 2012

Хорошо, у меня есть эти два куска кода, которые оба работают, но я не могу понять, как заставить их обоих работать вместе. Я хочу иметь возможность получить конечный результат из первого фрагмента кода, который говорит мне об абсолютном пути пользователя к рабочему столу (я говорю о пользователях, которые тоже из доменов, потому что программа работает без первого кода, чтобы найти рабочий стол пользователя, если пользователь основан на учетной записи, которая находится на самом компьютере, но он не работает, если вы входите в систему с учетной записью домена. Вот мой код, который я сделал для копирования файлов

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

 public class Mover
     public static void main(String[] args) throws IOException, InterruptedException    {   

        String currentdir = new File(".").getAbsolutePath();
        File TS3S = new File(currentdir + "/Teamspeak 3");
        File TS3D = new File(currentdir + "/TS3");
        File MinecraftLauncherS = new File(currentdir + "/Minecraft");
        File MinecraftLauncherD = new File(currentdir + "/Desktop");
        File ShortcutS = new File(currentdir + "/Shortcuts");
        File ShortcutD = new File(currentdir + "/Desktop");
        File MinecraftFilesS = new File(currentdir + "/minecraft files");
        File MinecraftFilesD = new File(currentdir + "/Application Data");
        File FrapsS = new File(currentdir + "/Fraps");
        File FrapsD = new File(currentdir + "/Fraps");

        //make sure source exists
        if(!TS3S.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(TS3S,TS3D);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }

        //make sure source exists
        if(!MinecraftLauncherS.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(MinecraftLauncherS,MinecraftLauncherD);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }


        //make sure source exists
        if(!MinecraftFilesS.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(MinecraftFilesS,MinecraftFilesD);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }

        //make sure source exists
        if(!ShortcutS.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(ShortcutS,ShortcutD);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }

        //make sure source exists
        if(!MinecraftLauncherS.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(FrapsS,FrapsD);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }

        System.out.println("Done");
        Runtime.getRuntime ().exec (currentdir + "/Desktop/TS3/ts3client_win32.exe");
        Runtime.getRuntime ().exec (currentdir + "/Desktop/Minecraft.exe");
        System.exit(0);
        }

    public static void copyFolder(File src, File dest)
        throws IOException{

        if(src.isDirectory()){

            //if directory not exists, create it
            if(!dest.exists()){
               dest.mkdir();
               System.out.println("Directory copied from " 
                              + src + "  to " + dest);
            }

            //list all the directory contents
            String files[] = src.list();

            for (String file : files) {
               //construct the src and dest file structure
               File srcFile = new File(src, file);
               File destFile = new File(dest, file);
               //recursive copy
               copyFolder(srcFile,destFile);
            }

        }else{
            //if file, then copy it
            //Use bytes stream to support all file types
            InputStream in = new FileInputStream(src);
                OutputStream out = new FileOutputStream(dest); 

                byte[] buffer = new byte[1024];

                int length;
                //copy the file content in bytes 
                while ((length = in.read(buffer)) > 0){
                   out.write(buffer, 0, length);
                }

                in.close();
                out.close();
                System.out.println("File copied from " + src + " to " + dest);
        }
    }
}

А вот код, который получает абсолютный путь к рабочему столу (который, я думаю, также работает, если пользователь вошел в сеть из доменной сети.)

import java.io.*;

public class WindowsUtils {
  private static final String REGQUERY_UTIL = "reg query ";
  private static final String REGSTR_TOKEN = "REG_SZ";
  private static final String DESKTOP_FOLDER_CMD = REGQUERY_UTIL 
 + "\"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\" 
 + "Explorer\\Shell Folders\" /v DESKTOP";

  private WindowsUtils() {}

  public static String getCurrentUserDesktopPath() {
try {
  Process process = Runtime.getRuntime().exec(DESKTOP_FOLDER_CMD);
  StreamReader reader = new StreamReader(process.getInputStream());

  reader.start();
  process.waitFor();
  reader.join();
  String result = reader.getResult();
  int p = result.indexOf(REGSTR_TOKEN);

  if (p == -1) return null;
  return result.substring(p + REGSTR_TOKEN.length()).trim();
}
catch (Exception e) {
  return null;
}
  }

  /**
   * TEST
   */
  public static void main(String[] args) {
    System.out.println("Desktop directory : " 
       + getCurrentUserDesktopPath());
  }


  static class StreamReader extends Thread {
private InputStream is;
private StringWriter sw;

StreamReader(InputStream is) {
  this.is = is;
  sw = new StringWriter();
}

public void run() {
  try {
    int c;
    while ((c = is.read()) != -1)
      sw.write(c);
    }
    catch (IOException e) { ; }
  }

String getResult() {
  return sw.toString();
}
  }
}

еще раз, чтобы уточнить мой вопрос. У меня есть эти две части кода. Моя оригинальная программа работает, только если учетная запись пользователя находится на самом жестком диске компьютера, но второй фрагмент кода должен находить каталог рабочего стола пользователя, даже если пользователь находится внутри доменной группы (информация об учетной записи извлекается с сервера в удаленном месте, и компьютер регистрируется на нем, а затем сохраняет информацию на удаленном сервере). Я хочу объединить эти два, чтобы он работал как для пользователей внутри локального диска, так и для пользователей из доменной группы. компьютеры, с которыми я работаю, - это только windows.

1 Ответ

1 голос
/ 02 апреля 2012

Если вы хотите получить результат метода getCurrentUserDesktopPath() в вашем классе Mover, вам просто нужно поместить эту строку в ваш основной метод:

String desktopPath = WindowsUtils.getCurrentUserDesktopPath();

Поскольку этот метод сделан статическим, вы не можетене нужно объявлять WindowsUtils объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...