All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aQute.lib.io.Windows Maven / Gradle / Ivy

The newest version!
package aQute.lib.io;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import aQute.lib.io.IO.OS;

class Windows implements OS {
	final static Pattern WINDOWS_BAD_FILE_NAME_P = Pattern.compile(
		"(?:(:?.*[\u0000-\u001F<>:\"|/\\\\?*].*)|\\.\\.|CON|PRN|AUX|NUL|COM\\d|COM¹|COM²|COM³|LPT\\d|LPT¹|LPT²|LPT³)(?:\\.\\w+)?",
		Pattern.CASE_INSENSITIVE);
	final static Pattern	DRIVE_P					= Pattern.compile("/?(?[a-z]:)", Pattern.CASE_INSENSITIVE);

	@Override
	public File getBasedFile(File base, String subPath) throws IOException {
		String use;
		Matcher matcher = WINDOWS_BAD_FILE_NAME_P.matcher(subPath);
		if (matcher.find()) {

			try {
				Path normalizedPath = Path.of(subPath)
					.normalize();

				if (normalizedPath.startsWith(IO.DOTDOT)) {
					throw new IOException("io.sub.up invalid path, will escape the designated directory. path='"
						+ subPath + "', base='" + base + "', normalized='" + normalizedPath + "'");
				}
				for (int i = 0; i < normalizedPath.getNameCount(); i++) {
					String segment = normalizedPath.getName(i)
						.toString();
					if (matcher.reset(segment)
						.matches()) {
						throw new IOException("io.win.sub.invalid pathcontains reserved names on windows. path='"
							+ subPath + "', base='" + base + "', pattern='" + WINDOWS_BAD_FILE_NAME_P + "'");
					}
				}
				use = normalizedPath.toString();
			} catch (java.nio.file.InvalidPathException e) {
				throw new IOException("io.win.sub.invalid pathcontains reserved names on windows. path='" + subPath
					+ "', base='" + base + "': '" + e.getMessage() + "'");
			}
		} else
			use = subPath;
		return new File(base, use);
	}

	@Override
	public String getenv(String string) {
		return IO.hc.getenv(string);
	}

	@Override
	public String toSafeFileName(String string) {
		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < string.length(); i++) {
			char c = string.charAt(i);
			if (c < ' ')
				continue;

			sb.append(switch (c) {
				case '<', '>', '"', '/', '\\', '|', '*', ':', '?' -> '%';
				default -> c;
			});
		}
		if (sb.length() == 0 || WINDOWS_BAD_FILE_NAME_P.matcher(sb)
			.matches())
			sb.append("_");

		return sb.toString();
	}

	@Override
	public File getFile(File base, String file) {
		file = file.replace('\\', '/');
		Matcher m = DRIVE_P.matcher(file);
		if (m.lookingAt()) {
			base = new File(m.group("drive"));
		}
		return Other.getFile0(base, file);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy