1. Java / Говнокод #14124

    +65

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    public class Path {
    	private String path;	
    	private char winSep = '\\';
    	private char unixSep = '/';
    	
    	public void set(String path){				
    		if(!path.endsWith(File.separator)){ 
    			path.concat(File.separator);
     		}
    		this.path = path;
    		if(File.separatorChar == winSep && path.charAt(0) == unixSep){ 
    			this.path = path.replace(unixSep, winSep).substring(1); 
     		}		
    				
    	 }
    
    	public String get(){
    		String path = new String(this.path);
     		return path;  	
    	}
    	
    	public String getRoot(){
    		String root = null;
    		 if(File.separatorChar == unixSep){ 
    			root = "/";
    		} 		
    		if(File.separatorChar == winSep){ 
    			root = this.path.substring(0, this.path.indexOf(winSep)+1);
    		}		
    		return root;
    	}
    	
    }

    в 6 йаве нету класса Path, пришлось самому делать костыль-велосипед. тут где-то ошибочка есть, пока не смотрел.

    Запостил: spivti, 22 Ноября 2013

    Комментарии (69) RSS

    • В жавке нету ОС-зависимого разделителя? И в commons никаких модулей нет?

      Квинтессенция жавки - каждый лепит падсибя велосипеды.
      Ответить
      • o да, придется переделывать.
        Просто путь исполняемого файла идет в URL форме. И в винде нужно другое отображение пути.
        commons не трогал, пока не трогал.
        Ответить
      • > нету ОС-зависимого разделителя
        Щито? File.pathSeparator
        Ответить
        • а толку. вы под эклипсom запустите, у меня почему-то он выдает ';'
          a вот File.separator выдает '\'
          Ответить
          • Всё, понял, в чём проблема. склейки/расклейки путей действительно нету. Только в apache.commons.
            Ответить
          • Это разделитель для PATH значит.
            Ответить
            • показать все, что скрыто— раздался пронзительный голос со стороны параши.

              Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?

              Петух — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его анус был разработан настолько, что он без труда мог спрятать в нём банку сгущёнки.
              Ответить
      • > В жавке нету ОС-зависимого разделителя?
        Это не ОС-зависимый разделитель. Это виндософтозависимый разделитель. Ядро винды ведь вполне понимает '/', и если бы не досовское наследие в прогах и мозгах программистов, винда вполне могла бы работать на '/', и всем было бы счастье...
        Ответить
        • Для расклейки путей тебе это не поможет.
          Ответить
          • Ядро винды ведь вполне понимает '/', и если бы не виндузятники, которые норовят использовать пути с '\\', винда вполне могла бы работать на '/', и всем было бы счастье...
            Ответить
            • показать все, что скрыто— раздался пронзительный голос со стороны параши.

              Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?

              Петух — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его анус был разработан настолько, что он без труда мог спрятать в нём банку сгущёнки.
              Ответить
      • Вижу ты заплюсовал себя пока не заминусовали;)
        Ответить
        • Побочное действие от опетушения опущенцев.
          Ответить
          • — раздался анонимный голос со стороны параши.

            Но пацаны, как всегда, не обратили внимания на это анонимное кукареканье. Пусть кукарекает, что с него взять, ведь у него нет ни лица, ни даже имени?

            Аноним — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора-двух лет каждая ночь была очень трудной, так как он был вынужден делить свой анус с фраером и питоном. Да, да, все так: в анусе у него жил питон, также он иногда прятал там своего фраера, в моменты, когда к нему заглядывал хозяин, чтобы не переплачивать за съемную квартиру. Чтобы не усложнять читателя подробностями, скажем лишь, что его анус был разработан настолько, что он без труда мог спрятать в нём банку пару банок сгущёнки, буханку хлеба и своего фраера - не считая своего ручного питона, разумеется...
            Ответить
            • показать все, что скрытоРаздался пронзительный голос guest-a...
              Ответить
              • Держать питона в анусе - что это: последний писк аристократизма, или ты просто латентный гей?
                Ответить
                • >>Держать питона в анусе - что это?

                  Это малозаметная хуйня, ништяк.
                  Как насчет того, чтобы держать в жопе дельфина? То-то...

                  ps/s въебал всем по минусу.
                  Ответить
    • > в 6 йаве нету класса Path

      Зато есть его предшественник - java.io.File.
      Ответить
      • к сожаленью это погоды не улучшит, склейки и расклейки путей там нету, мне как раз это и нужно.
        А в org.apache.commons.io в классе FilenameUtils все уже имется.
        Ответить
    • строчки 8 и 10...точно имелось ввиду именно то, что написано?
      Ответить
      • строчка 8 ошибочна и 10 не нужна
        Склейку -расклейку путей я сделал в другом классе, если интересно выложу потом какнибудь.
        =====================
        сейчас это выглядит так
        import java.io.File;
        import org.apache.commons.io.FilenameUtils;
        
        public class Path {
        	private String path;
        	
        	public void setPath(String path){
        		if(path.endsWith(File.separator) == false){			
        			this.path = path.concat(File.separator); 
        
        		}
        
        	}	
        	
        	public String getPath(){
        		return this.path;
        	}
        	
        	public String getRoot(){
        		return FilenameUtils.getPrefix(path);
        	}
        	
        	public void initPath(){
        		ClassLoader loader = Main.class.getClassLoader();
        		path = loader.getResource("Path.class").getPath();		
        		path = FilenameUtils.separatorsToSystem(path);
        		path = FilenameUtils.getFullPath(path);
        	
        		if(File.separatorChar == '\\'){ 
        			path = path.substring(1);
        		}		
        		
        	}
        	
        }  // end
        Ответить
    • Склейкa -расклейкa путей
      =======================
      public void change(Map<String, Character> inArgs, Path path, String pathForChange)
      				throws IllegalArgumentException, SecurityException {		
      	        if(pathForChange.length()!= 0){ 		
      				if(inArgs.isEmpty())
      					changeByEnteredPath(path, pathForChange);
      				else
      					throw new IllegalArgumentException("Bad command syntax: need only key or path");		
      			} else {
      				changeByKey(path, inArgs);  
      			}	
      		}
      		
      	private void changeByKey(Path path, Map<String, Character> inArgs){				
      			if(path.getRoot().equals(path.getPath())){
      				System.out.println("Cannot change root: " + path.getRoot() + " by cd, cd.. or cd\\");
      				return;
      			} 				
      			if(inArgs.isEmpty() || inArgs.containsKey(args[0])){
      				String changedDirOneLevelBelow = FilenameUtils.getFullPath
      						(FilenameUtils.getFullPathNoEndSeparator(path.getPath()));
      				path.setPath(changedDirOneLevelBelow);					
      			} else { 						
      				path.setPath(FilenameUtils.getPrefix(path.getPath()));			
      			}
      			
      		}
      		
      	private void changeByEnteredPath(Path path, String forChange)
      				throws IllegalArgumentException, SecurityException{
      			String concated = FilenameUtils.concat(path.getPath() , forChange); 
      																				
      			if(new File(concated).exists()){ 
      				path.setPath(concated);
      				
      			}else { 
      				
      				if(new File(forChange).exists()) 
      					path.setPath(forChange);			
      				else 
      					throw new IllegalArgumentException				
      					("Bad new path or path part: " + concated + "\n or: " +  forChange);								
      			}		
      		}
      Ответить
      • > if(path.endsWith(File.separator) == false){
        А если не кончается на сепаратор, то молча делаем вид, что setPath вообще не вызывали, да? :)

        Что вообще происходит в этих функциях? :)
        Ответить
        • 0) inArgs пустое, pathForChange пустое - отбрасываем от path последний компонент (аля cd ..).
          1) inArgs пустое, а путь, полученный после конкатенации pathForChange к текущему пути существует - делаем сконкатенированный путь текущим. (аля cd на относительный путь).
          2) inArgs пустое, а путь, полученный после конкатенации pathForChange не существует, зато существует сам pathForChange - делаем его текущим. (аля cd на абсолютный путь).
          3) inArgs пустое, ни сконкатенированный ни сам pathForChange не существуют - бросается исключение ""Bad new path or path part".
          4) inArgs не пустое, pathForChange не пустое - бросается исключение "need only key or path".
          5) inArgs содержит некий args[0], pathForChange пустое - отбрасываем от path последний компонент (аля cd ..).
          6) inArgs не пустое, и не содержит некого args[0], pathForChange пустое - прыгаем в корень диска (аля cd \ в винде или cd / в линухе).

          Что за неудачная эмуляция cd? :))

          if (new File(concated).exists()), имхо, говно: обычно относительный путь отличают от абсолютного тупо по наличию '/', '\' или имени диска в начале. А в твоем коде change на /lib из папки /usr прыгнет в /usr/lib вместо /lib :)
          Ответить
          • Что за неудачная эмуляция cd? :))

            какая есть).

            if (new File(concated).exists()) дерьмецо еще то, конечно, но нужно проверить корректность существования пути. в org.apache.commons.io.FilenameUtils вроде такая возможность есть но как-то не так работает.
            Либо делать как-то по другому.
            Ответить
            • Относительный\абсолютный путь можно отличать по наличию / \ или c: в начале пути. Ну а проверка на существование если нужна, то пусть остается. Главное не пытаться по ней отличать относительный путь от абсолютного ;)

              P.S. Что за таинственные inArgs и args[0]?
              Ответить
              • Никакой мистики)) - это ключи команды,
                например
                if(inArgs.isEmpty() || inArgs.containsKey(args[0]))

                args[0] определен в этом классе. Т.е. определение наличие такого (args[0] ) ключа в списке введенных пользователем ключей.
                Ответить
                • > args[0] определен в этом классе. Т.е. определение наличие такого (args[0] ) ключа в списке введенных пользователем ключей.
                  Спасибо кэп, это видно и из кода. Но что все-таки лежит в args[0]? :)

                  P.S. Как ты ловко отвечаешь на вопросы, чтобы ничего лишнего не раскрыть...
                  Ответить
                  • args[0] у меня
                    String args[] = {"..", "\\"};

                    Вот так банально)
                    Ответить
                    • Ну и для кого придумали символические константы? :) Две константы всяко понятней чем какой-то неведомый args, в котором лежат никак не связанные друг с другом строки.
                      Ответить
                      • да ,это, камень мне в огород). надо будет подправить , я так полагаю должно быть так
                        final string key1 = ".."
                        final string key1 = "\\"


                        Только этот модуль содержит только ключи, в программе предусмотрен вариант как ключи с атрибутами.. Т.е. эти хранятся у меня в таком виде

                        String args[] = {"а:ahd", "o:skg"};

                        где а , о - ключи, после : идут возможные атрибуты
                        Ответить
                        • А, так вон что такое args... Это список всех возможных ключей... Так бы сразу и сказал ;)

                          > возможные атрибуты
                          Т.е. прогу с String args[] = {"а:ahd", "o:skg"} можно вызвать как-то так?
                          program a -a<hui> -h<pizda> -d<djigurda>
                          program o -s<hui> -k<pizda> -g<djigurda>
                          program o -g<djigurda>
                          Ответить
                          • типо того, конкретный формат вызова
                            имя команды ключ:атрибут1 ключ:атрибут2 ключ:атрибутN /строка ;
                            имя команды ключ1 ключ2 ключN /строка ;
                            имя команды /строка ;

                            также немного усложненный вариант
                            имя команды1 ключ:атрибут1 ключ:атрибут2 ключ:атрибутN /строка &&
                            имя команды2 ключ:атрибут1 ключ:атрибут2 ключ:атрибутN /строка &&
                            имя командыN ключ:атрибут1 ключ:атрибут2 ключ:атрибутN /строка ;

                            Сделал практически все, но нада улучшить код и его читабельность.

                            Про символные константы забыл, хорошая вещь, спасиб)
                            Ответить
                            • Что люди только не делают, чтобы не освоит искоробочный парсер аргументов.
                              Ответить
                              • Ты так говоришь, как-будто в жабе есть изкоробочный парсер аргументов ;)
                                Ответить
                                • Но велосипедов на эту тему сотни ;) Как минимум есть реализация от commons.
                                  Ответить
                                • Неужели опять соснули? Жаваёбы уже просто даже не вынимают, незачем.

                                  А не, это ты соснул. По крайней мере внешние есть.
                                  Ответить
                                  • > А не, это ты соснул. По крайней мере внешние есть.
                                    Где эт я соснул? Я же ответил тебе "Ты так говоришь, как-будто в жабе есть изкоробочный парсер аргументов ;)", а ниже написал что есть куча внешних велосипедов. Так что соснул не я, а автор очередного велосипедного парсера аргументов, по совместительству ОП :)
                                    Ответить
                                    • Велосипед в моем понимании - риально удобно риально падсибя, а то не велосипед, а внешняя либа. Алсо жавка без коммонс неюзабельна же.
                                      Ответить
                                      • > Алсо жавка без коммонс неюзабельна же.
                                        Так же как и кресты без буста.
                                        Ответить
                                        • А сишка без чего?
                                          Ответить
                                          • > А сишка без чего?
                                            А сишка без нихуя ;(
                                            Ответить
                                            • Для сишки есть glib, правда, я его никогда не использовал, ибо на чистой сишке писал только под весьма специфичные платформы.
                                              Ответить
                                • Ну хорошо, не искоробочный, а стандарт де факто, должен же быть такой?
                                  Ответить
                                  • > стандарт де факто
                                    Ну, наверное, commons cli. Хотя jcommander, который сегодня посоветовал Роман, мне больше понравился.
                                    Ответить
        • А если не кончается на сепаратор, то молча делаем вид, что setPath вообще не вызывали, да? :)

          моя реализация такая есть несколько классов всем известного аналога комманд.ком
          эти команды корректо работают с добавленным сепаратором. добавлять его удобно в Одном месте. Что сделано в setPath.
          Ответить
          • чето-то гк борахлит...
            Ответить
          • > эти команды корректо работают с добавленным сепаратором. добавлять его удобно в Одном месте. Что сделано в setPath.
            Дык если сепаратор на конце path уже есть, то setPath нихуя ничего не делает... Или это такая фича, и else this.path = path там действительно не нужно? :)
            Ответить
            • ОК, понел, допустим пользователь вводит часть пути или новый путь без сепаратора, нужно его добавить, ведь так?
              Ответить
              • Ну с этой частью все ок. Если сепаратора нет - он добавляется. Но если сепаратор уже есть, то setPath() НИЧЕГО не делает. В this.path остается тот путь, который там валялся до этого.

                Допустим в path лежал путь "/tmp/".

                После path.setPath("/home/bormand") path.getPath() вернет нам "/home/bormand/", что соответствует твоим намерениям.

                А вот после path.setPath("/home/spitivi/") path.getPath() по-прежнему будет нам возвращать "/tmp/", что явно косяк. Или это фича?
                Ответить
                • скорее это временный костыль. например команда дир у меня не выводит содержимое например /home/bormand (ссори сижу сейчас в вин7), а выводит содержимое /home/.
                  Поэтому я и приклеиваю "/".
                  кусочек кода дир команды

                  File f = new File(path);
                  List<File> filesList = Arrays.asList(f.listFiles());
                  Ответить
            • прозевал этот момент я,
              ====
              else this.path = path там действительно не нужно? :)

              очень даже нужно.
              Ответить

    Добавить комментарий