/** * Find free space on the Windows platform using the 'dir' command. * * @param path the path to get free space for, including the colon * @param timeout The timeout amount in milliseconds or no timeout if the value is zero or less * @return the amount of free drive space on the drive * @throws IOException if an error occurs */ long freeSpaceWindows(String path, final long timeout) throws IOException { path = FilenameUtils.normalize(path, false); if (path.length() > 0 && path.charAt(0) != '"') { path = "\"" + path + "\""; } // build and run the 'dir' command final String[] cmdAttribs = new String[] {"cmd.exe", "/C", "dir /a /-c " + path}; // read in the output of the command to an ArrayList final List<String> lines = performCommand(cmdAttribs, Integer.MAX_VALUE, timeout); // now iterate over the lines we just read and find the LAST // non-empty line (the free space bytes should be in the last element // of the ArrayList anyway, but this will ensure it works even if it's // not, still assuming it is on the last non-blank line) for (int i = lines.size() - 1; i >= 0; i--) { final String line = lines.get(i); if (line.length() > 0) { return parseDir(line, path); } } // all lines are blank throw new IOException( "Command line 'dir /-c' did not return any info " + "for path '" + path + "'"); }
public static boolean directoryContains(File directory, File child) throws IOException { if (directory == null) { throw new IllegalArgumentException("Directory must not be null"); } if (!directory.isDirectory()) { throw new IllegalArgumentException("Not a directory: " + directory); } if (child == null) { return false; } if ((!directory.exists()) || (!child.exists())) { return false; } String canonicalParent = directory.getCanonicalPath(); String canonicalChild = child.getCanonicalPath(); return FilenameUtils.directoryContains(canonicalParent, canonicalChild); }
public static boolean isSymlink(File file) throws IOException { if (file == null) { throw new NullPointerException("File must not be null"); } if (FilenameUtils.isSystemWindows()) { return false; } File fileInCanonicalDir = null; if (file.getParent() == null) { fileInCanonicalDir = file; } else { File canonicalDir = file.getParentFile().getCanonicalFile(); fileInCanonicalDir = new File(canonicalDir, file.getName()); } if (fileInCanonicalDir.getCanonicalFile().equals(fileInCanonicalDir.getAbsoluteFile())) { return false; } return true; }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); for (FileItem item : items) { if (item.isFormField()) { // Process regular form field (input type="text|radio|checkbox|etc", select, etc). String fieldname = item.getFieldName(); String fieldvalue = item.getString(); // ... (do your job here) } else { // Process form file field (input type="file"). String fieldname = item.getFieldName(); String filename = FilenameUtils.getName(item.getName()); InputStream filecontent = item.getInputStream(); // ... (do your job here) } } } catch (FileUploadException e) { throw new ServletException("Cannot parse multipart request.", e); } // ... }
/** * Enumeration of IO case sensitivity. * * <p>Different filing systems have different rules for case-sensitivity. Windows is * case-insensitive, Unix is case-sensitive. * * <p>This class captures that difference, providing an enumeration to control how filename * comparisons should be performed. It also provides methods that use the enumeration to perform * comparisons. * * <p>Wherever possible, you should use the <code>check</code> methods in this class to compare * filenames. * * @author Stephen Colebourne * @version $Id$ * @since Commons IO 1.3 */ public final class IOCase implements Serializable { /** The constant for case sensitive regardless of operating system. */ public static final IOCase SENSITIVE = new IOCase("Sensitive", true); /** The constant for case insensitive regardless of operating system. */ public static final IOCase INSENSITIVE = new IOCase("Insensitive", false); /** * The constant for case sensitivity determined by the current operating system. Windows is * case-insensitive when comparing filenames, Unix is case-sensitive. * * <p>If you derialize this constant of Windows, and deserialize on Unix, or vice versa, then the * value of the case-sensitivity flag will change. */ public static final IOCase SYSTEM = new IOCase("System", !FilenameUtils.isSystemWindows()); /** Serialization version. */ private static final long serialVersionUID = -6343169151696340687L; /** The enumeration name. */ private final String name; /** The sensitivity flag. */ private final transient boolean sensitive; // ----------------------------------------------------------------------- /** * Factory method to create an IOCase from a name. * * @param name the name to find * @return the IOCase object * @throws IllegalArgumentException if the name is invalid */ public static IOCase forName(String name) { if (IOCase.SENSITIVE.name.equals(name)) { return IOCase.SENSITIVE; } if (IOCase.INSENSITIVE.name.equals(name)) { return IOCase.INSENSITIVE; } if (IOCase.SYSTEM.name.equals(name)) { return IOCase.SYSTEM; } throw new IllegalArgumentException("Invalid IOCase name: " + name); } // ----------------------------------------------------------------------- /** * Private constructor. * * @param name the name * @param sensitive the sensitivity */ private IOCase(String name, boolean sensitive) { this.name = name; this.sensitive = sensitive; } /** * Replaces the enumeration from the stream with a real one. This ensures that the correct flag is * set for SYSTEM. * * @return the resolved object */ private Object readResolve() { return forName(name); } // ----------------------------------------------------------------------- /** * Gets the name of the constant. * * @return the name of the constant */ public String getName() { return name; } /** * Does the object represent case sensitive comparison. * * @return true if case sensitive */ public boolean isCaseSensitive() { return sensitive; } // ----------------------------------------------------------------------- /** * Compares two strings using the case-sensitivity rule. * * <p>This method mimics {@link String#compareTo} but takes case-sensitivity into account. * * @param str1 the first string to compare, not null * @param str2 the second string to compare, not null * @return true if equal using the case rules * @throws NullPointerException if either string is null */ public int checkCompareTo(String str1, String str2) { if (str1 == null || str2 == null) { throw new NullPointerException("The strings must not be null"); } return sensitive ? str1.compareTo(str2) : str1.compareToIgnoreCase(str2); } /** * Compares two strings using the case-sensitivity rule. * * <p>This method mimics {@link String#equals} but takes case-sensitivity into account. * * @param str1 the first string to compare, not null * @param str2 the second string to compare, not null * @return true if equal using the case rules * @throws NullPointerException if either string is null */ public boolean checkEquals(String str1, String str2) { if (str1 == null || str2 == null) { throw new NullPointerException("The strings must not be null"); } return sensitive ? str1.equals(str2) : str1.equalsIgnoreCase(str2); } /** * Checks if one string starts with another using the case-sensitivity rule. * * <p>This method mimics {@link String#startsWith(String)} but takes case-sensitivity into * account. * * @param str the string to check, not null * @param start the start to compare against, not null * @return true if equal using the case rules * @throws NullPointerException if either string is null */ public boolean checkStartsWith(String str, String start) { return str.regionMatches(!sensitive, 0, start, 0, start.length()); } /** * Checks if one string ends with another using the case-sensitivity rule. * * <p>This method mimics {@link String#endsWith} but takes case-sensitivity into account. * * @param str the string to check, not null * @param end the end to compare against, not null * @return true if equal using the case rules * @throws NullPointerException if either string is null */ public boolean checkEndsWith(String str, String end) { int endLen = end.length(); return str.regionMatches(!sensitive, str.length() - endLen, end, 0, endLen); } /** * Checks if one string contains another at a specific index using the case-sensitivity rule. * * <p>This method mimics parts of {@link String#regionMatches(boolean, int, String, int, int)} but * takes case-sensitivity into account. * * @param str the string to check, not null * @param strStartIndex the index to start at in str * @param search the start to search for, not null * @return true if equal using the case rules * @throws NullPointerException if either string is null */ public boolean checkRegionMatches(String str, int strStartIndex, String search) { return str.regionMatches(!sensitive, strStartIndex, search, 0, search.length()); } /** * Converts the case of the input String to a standard format. Subsequent operations can then use * standard String methods. * * @param str the string to convert, null returns null * @return the lower-case version if case-insensitive */ String convertCase(String str) { if (str == null) { return null; } return sensitive ? str : str.toLowerCase(); } // ----------------------------------------------------------------------- /** * Gets a string describing the sensitivity. * * @return a string describing the sensitivity */ public String toString() { return name; } }