кроссплатформенный ls

 
 
 
Сообщения:12
Это относится к разряду системного программирования на java.
Данный код не блещет мастерством поэтому выкладываю как OpenSource. Лицензия gpl 3.0.
Исходный код:
/*  ls на java
    Copyright (C) 2017  Morteryler

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
import java.util.*;
import java.io.*;

import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.concurrent.TimeUnit;
import java.time.*;
import java.time.format.*;

public class ls
{
  public static void main(String[] args)
  {
	    ParamsLs keys = new ParamsLs();
	    ArrayList<String> dirs = new ArrayList<>(); //каталоги или файлы
	    char c;
	    StringBuilder ФайлСпутями = new StringBuilder("");
	    for(int i=0; i<args.length; i++) {
	      c = args[i].charAt(0);
	      if( c=='-' ) {
	        for(int k=1; k<args[i].length(); k++) {
	          c = args[i].charAt(k);
	          if(k==1 && c=='-') {
	              if(args[i].compareTo("--all") == 0)
	              	keys.a=true;
	              else if(args[i].compareTo("--full") == 0)
	              	keys.l=true;
	              else if(args[i].compareTo("--human-readable") == 0)
	              	keys.h=true;
	              else if(args[i].compareTo("--help") == 0) {
	              	ParamsLs.printInfo();
	              	System.exit(1);
	              }
	              else if(args[i].compareTo("--version") == 0) {
	              	System.out.println(
	              		"Версия: 1.0\nCopyright (C) 2017 Morteryler programms"
	              	);
	              	System.exit(1);
	              }
	              else {
	                System.out.println("[Ошибка] Ключ "+args[i]+" не существует. Используйте --help для вызова справки");
	                System.exit(1);
	              }
	              break;
	            }
	            if(c == 'a')
	            	keys.a=true;
	            else if(c == 'l')
	            	keys.l=true;
	            else if(c == 'F') {
	            	if( (args.length-1) == i ) {
	            		System.out.println("Нету имени файла после ключа -F");
	            		System.exit(1);
	            	}
	            	else {
	            		File test = new File(args[++i]);
	            		if(!test.exists​()) {
	            			System.out.println("Ошибка: файл '"+args[i]+"' не существует");
	            			System.exit(1);
	            		}
	            		else {
	            			ФайлСпутями.setLength(0); //очищаем для того чтоб затереть прошлое значение если ранее был указан ключ F
	            			ФайлСпутями.append(args[i]);
	            			keys.F=true;
	            			break; //перейти через один аргумент
	            		}
	            	}
	            }
	            else if(c == 'h')
	            	keys.h=true;
	          	else {
	            	System.out.println("[Ошибка] Ключ -"+c+" не существует. Используйте --help для вызова справки");
	            	System.exit(1);
	          	}
	        }
	     }
	     else
	     	dirs.add(args[i]);
   	}

   	if(keys.F) {
   		FunctionsLs.readFromFile(ФайлСпутями.toString(), keys);
   		System.exit(0);
   	}

   	if(dirs.size() > 0) {
   		for(int i=0; i<dirs.size(); i++) //выводим все папки/файлы
   			FunctionsLs.print(dirs.get(i), keys);
   	}
   	else
   		FunctionsLs.print(".", keys); //текущий каталог
   	

	}
}

class FunctionsLs
{
	static void print(String name, ParamsLs keys)
	{
		File f = new File(name);
		if(!f.exists​()) {
			System.out.println("Невозможно открыть \""+name+"\": Файл или папка не существует");
			return;
		}

		if(!f.canRead​() && f.isDirectory​()) {
			System.out.println("Невозможно открыть \""+name+"\": Отказано в доступе");
			return;
		}

		if(f.isFile​() || !f.isDirectory​()) {
			FileInfo(f, keys);
		}

		if(f.isDirectory​())
		{
			File[] arrFiles = f.listFiles();
			for(File obj : arrFiles) {
				if(obj.isHidden​() && !keys.a) continue; //пропускаем скрытые файлы

				FileInfo(obj, keys);
			}
		}
	}

	static void FileInfo(File f, ParamsLs keys) //печатаем инфу
	{
		if(keys.l)
		{
			try {
				PosixFileAttributes attr = Files.getFileAttributeView(f.toPath​(), PosixFileAttributeView.class).readAttributes(); //чтение группы и владельца
				String rwx = PosixFilePermissions.toString(attr.permissions​()); //получаем права в понятном виде
				if(Files.isSymbolicLink​(f.toPath​()))
					System.out.print("l");
				else if(f.isDirectory​())
					System.out.print("d");
				else
					System.out.print("-");
				System.out.print(rwx+" ");
				System.out.print(attr.group​()+":"+attr.owner​());

				if(keys.h)
					System.out.format(" %s ", sizeFile(Files.size(f.toPath​())) );
				else
					System.out.print(" "+Files.size(f.toPath​())+" ");

				System.out.format(" %s ", getFileCreationTime(f));

				System.out.print(f.getName());

				if(Files.isSymbolicLink​(f.toPath​()))
				{
					Path fullpath = Files.readSymbolicLink(f.toPath​()); //узнаем полный путь до файла
					System.out.print(" -> "+fullpath.toString());
				}

				System.out.println();
			}
			catch(IOException e) {}
		}
		else
			System.out.println(f.getName());
	}

	static void readFromFile(String name, ParamsLs keys)
	{
		try( BufferedReader f = new BufferedReader(new FileReader(name)) )
		{
			String s;
			while( (s=f.readLine()) != null ) {
				System.out.println(s+":");
				print(s, keys);
				System.out.println();
			}
		}
		catch(IOException e) {
			System.out.println(e);
		}
	}

	strictfp static String sizeFile(long size) //возвращает размер файла в понятной для человека форме
	{
		if(size < 1024) return ""+size;
		StringBuilder s = new StringBuilder("");
		if(size < 1024000) //килобайты
			s.append( String.format("%.1fK", (double)size/1024) );
		else if(size > 1024000 && size < 1024000000) //мегабайты
			s.append( String.format("%.1fM", (double)size/1024000 ) );
		else if(size > 1024000000) //далее идут гигиабайты
			s.append( String.format("%.1fG", (double)size/1024000000) );
		return s.toString();
	}

	static String getFileCreationTime(File f)
	{
		BasicFileAttributes times = null;
		try {
			times = Files.readAttributes(f.toPath​(), BasicFileAttributes.class);
		}
		catch(IOException e) {
			System.out.println("Ошибка получения атрибутов - выход");
			System.exit(2);
		}

		StringBuilder result = new StringBuilder();
		FileTime ft = times.creationTime(); //получаем время создания файла
		Instant I = ft.toInstant();
		ZonedDateTime zt = I.atZone(ZoneId.of("Europe/Paris"));
		Month m = zt.getMonth();
		result.append( m.getDisplayName(TextStyle.valueOf("SHORT"), Locale.ENGLISH) );
		result.append(zt.format( DateTimeFormatter.ofPattern(" dd HH:mm") ));
		return result.toString();
	}
}

class ParamsLs
{
	boolean a=false;
	boolean l=false;
	boolean F=false;
	boolean h=false;

	static void printInfo()
	{
		System.out.println(
			"Использование: ls [КЛЮЧ]… [ФАЙЛ]…\n\n"+
			"-a, --all\tне скрывать файлы начинающиеся с .\n"+
			"-l, --full\tиспользовать широкий формат\n"+
			"-F [файл]\tвзять пути из файла\n\n"+
			"--help\t\tвывести данную справку и выйти\n"+
			"--version\tверсия программы"
		);
	}
}

Изменен:13 ноя 2017 10:46
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет