### Eclipse Workspace Patch 1.0 #P org.eclipse.rse.services.local Index: src/org/eclipse/rse/internal/services/local/files/LocalFileService.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java,v retrieving revision 1.26 diff -u -r1.26 LocalFileService.java --- src/org/eclipse/rse/internal/services/local/files/LocalFileService.java 7 Feb 2008 16:10:19 -0000 1.26 +++ src/org/eclipse/rse/internal/services/local/files/LocalFileService.java 11 Feb 2008 11:00:42 -0000 @@ -30,6 +30,7 @@ * Kevin Doyle (IBM) - [208778] [efs][api] RSEFileStore#getOutputStream() does not support EFS#APPEND * David McKnight (IBM) - [209593] [api] add support for "file permissions" and "owner" properties for unix files * Radoslav Gerganov (ProSyst) - [218173] [local] non-generic filters don't work + * Martin Oberhuber (Wind River) - [188330] Problems Copying files with $ in name ********************************************************************************/ package org.eclipse.rse.internal.services.local.files; @@ -1233,8 +1234,20 @@ return movedOk; } - - + /** + * Quote a file name such that it is valid in a shell + * @param s file name to quote + * @return quoted file name + */ + protected String enQuote(String s) + { + if(isWindows()) { + return '"' + s + '"'; + } else { + return PathUtility.enQuoteUnix(s); + } + } + public boolean copy(String srcParent, String srcName, String tgtParent, String tgtName, IProgressMonitor monitor) throws SystemMessageException { File srcFile = new File(srcParent, srcName); @@ -1243,8 +1256,6 @@ String command = null; boolean folderCopy = srcFile.isDirectory(); String src = srcFile.getAbsolutePath(); - - String target = tgtFile.getAbsolutePath(); boolean sourceIsVirtual = ArchiveHandlerManager.isVirtual(src); @@ -1259,24 +1270,10 @@ return copyToArchive(srcFile, new File(tgtParent), tgtName, monitor, SystemEncodingUtil.ENCODING_UTF_8, SystemEncodingUtil.ENCODING_UTF_8, false); } - // handle special characters in source and target strings - StringBuffer srcBuf = new StringBuffer(src); - StringBuffer tgtBuf = new StringBuffer(target); - handleSpecialChars(srcBuf); - handleSpecialChars(tgtBuf); - - src = "\"" + srcBuf.toString() + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - target = "\"" + tgtBuf.toString() + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - /* - // handle imbedded blanks of from or to name... - if (src.indexOf(' ') >= 0) - src = "\"" + src + "\""; - if (target.indexOf(' ') >= 0) - target = "\"" + target + "\""; - */ - boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("win"); //$NON-NLS-1$ //$NON-NLS-2$ - if (isWindows) + src = enQuote(src); + target = enQuote(target); + if (isWindows()) { if (folderCopy) { @@ -1284,16 +1281,13 @@ } else { - //command = _osCmdShell + "copy " + src + " " + target; //$NON-NLS-1$ //$NON-NLS-2$ // create target first so that not prompted - File targetFile = new File(tgtBuf.toString()); - if (!targetFile.exists()) + if (!tgtFile.exists()) { // create file so as to avoid ambiguity try { - targetFile.createNewFile(); - + tgtFile.createNewFile(); } catch (Exception e) { @@ -1305,7 +1299,6 @@ } else { - if (folderCopy) { command = "cp -Rp " + src + " " + target; //$NON-NLS-1$ //$NON-NLS-2$ @@ -1320,7 +1313,7 @@ { Process p = null; Runtime runtime = Runtime.getRuntime(); - if (isWindows) + if (isWindows()) { String theShell = "cmd /C "; //$NON-NLS-1$ p = runtime.exec(theShell + command); @@ -1348,39 +1341,6 @@ return (rc == 0); } - protected void handleSpecialChars(StringBuffer buf) - { - for (int i = 0; i < buf.length(); i++) - { - char c = buf.charAt(i); - - boolean isSpecialChar = isSpecialChar(c); - - if (isSpecialChar) - { - buf.insert(i, "\\"); //$NON-NLS-1$ - i++; - } - } - } - - /** - * Checks whether the given character is a special character in the shell. A special character is - * '$', '`', '"' and '\'. - * @param c the character to check. - * @return true if the character is a special character, false otherwise. - */ - protected boolean isSpecialChar(char c) { - - if ((c == '$') || (c == '`') || (c == '"') || (!isWindows() && (c == '\\')) ) { - - return true; - } - else { - return false; - } - } - /** * Copy a file or folder to a new target parent folder, but if * copying from an archive, extract the file in the encoding specified @@ -1391,7 +1351,7 @@ * @param sourceEncoding encoding of source file * @param targetEncoding desired encoding of target file * @param isText currently unused - * @return true iff the copy succeeded + * @return true if the copy succeeded */ public boolean copyFromArchive(File sourceFolderOrFile, File targetFolder, String newName, IProgressMonitor monitor, String sourceEncoding, String targetEncoding, boolean isText) throws SystemMessageException {