1. 程式人生 > >工具類批量修改照片的名字

工具類批量修改照片的名字

同步照片的時候,發現照片名字不規則 。 以下類產生的格式 2014-04-20 09.44.43.jpg  
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;


/*******************************************************************************
 * 
 * 讀出數碼圖片中的拍照時間
 * 
 * 
 * 原理:
 * 
 * 1、由於數碼圖片的拍照時間可以直接從圖片中搜索到,所以本例不需要分析EXIF的格式。
 * 
 * 2、正常的(Normal)數碼圖片,會有三處到四處的時間,其中第二、第三處固定在一起,
 * 
 * 第二處是圖片拍攝時間,第三處是圖片儲存時間,一般兩者相同,他們之間用NULL值
 * 
 * 分隔(ASCII值為0),如下:
 * 
 * 2001:01:02 12:23:56[NULL]2001:01:02 12:23:56[NULL] 2001/01/02
 * 12:23[NULL]2001/01/02 12:23[NULL]
 * 
 * 兩者位置不定,但格式好查詢,八個冒號,兩個空格,兩個NULL值,其餘為數字。
 * 
 * 不用考慮01:09:34被壓縮為1:9:34這樣的特例,見EXIF2.1規範關於時間的三段:
 * 
 * 1. DateTime(第一處,修改時間)
 * 
 * The date and time of image creation. In this standard it is the date and time
 * 
 * the file was changed.
 * 
 * The format is "YYYY:MM:DD HH:MM:SS" with time shown in 24-hour format, and
 * 
 * the date and time separated by one blank character [20.H].
 * 
 * When the date and time are unknown, all the character spaces except colons
 * (":")
 * 
 * may be filled with blank characters, or else the Interoperability field may
 * be
 * 
 * filled with blank characters.
 * 
 * The character string length is 20 bytes including NULL for termination.
 * 
 * When the field is left blank, it is treated as unknown.
 * 
 * Tag = 306 (132.H)
 * 
 * Type = ASCII
 * 
 * Count = 20
 * 
 * Default = none
 * 
 * 2. DateTimeOriginal(第二處,拍攝時間)
 * 
 * The date and time when the original image data was generated. For a DSC the
 * 
 * date and time the picture was taken are recorded.
 * 
 * The format is "YYYY:MM:DD HH:MM:SS" with time shown in 24-hour format, and
 * 
 * the date and time separated by one blank character [20.H].
 * 
 * When the date and time are unknown, all the character spaces except colons
 * (":")
 * 
 * may be filled with blank characters, or else the Interoperability field may
 * be
 * 
 * filled with blank characters.
 * 
 * The character string length is 20 bytes including NULL for termination.
 * 
 * When the field is left blank, it is treated as unknown.
 * 
 * Tag = 36867 (9003.H)
 * 
 * Type = ASCII
 * 
 * Count = 20
 * 
 * Default = none
 * 
 * 3. DateTimeDigitized(第三處,儲存時間)
 * 
 * The date and time when the image was stored as digital data. If, for example,
 * 
 * an image was captured by DSC and at the same time the file was recorded, then
 * 
 * the DateTimeOriginal and DateTimeDigitized will have the same contents.
 * 
 * The format is "YYYY:MM:DD HH:MM:SS" with time shown in 24-hour format, and
 * 
 * the date and time separated by one blank character [20.H].
 * 
 * When the date and time are unknown, all the character spaces except colons
 * (":")
 * 
 * may be filled with blank characters, or else the Interoperability field may
 * be
 * 
 * filled with blank characters.
 * 
 * The character string length is 20 bytes including NULL for termination.
 * 
 * When the field is left blank, it is treated as unknown.
 * 
 * Tag = 36868 (9004.H)
 * 
 * Type = ASCII
 * 
 * Count = 20
 * 
 * Default = none
 * 
 * 3、特別的(Special)相機,如富士系列FUJIFILM,使用XML格式記錄EXIF,時間格式如下:
 * 
 * <exif:DateTimeOriginal>2006-12-24T12:33:08+08:00</exif:DateTimeOriginal>
 * 
 * 對比正常的(Normal)相片,我們發現兩者格式很類似:
 * 
 * 2006:12:24 12:33:08 Normal
 * 
 * 2006-12-24T12:33:08 Special
 * 
 * 
 * 另外:
 * 
 * 1、由於本人測試的*.tif和*.tiff圖片是由*.jpg通過ACDSee轉換的,所以可能不準。
 * 
 * 2、當然,網上有現成的包可供利用,詳細方法請自行搜尋,以下是包下載地址:
 * 
 * http://www.drewnoakes.com/code/exif/releases/metadata-extractor-2.2.0.jar
 * 
 * 3、此例沒有按照標準的Java規範格式化。
 * 
 * 4、開源的目的只有一個:我為人人,人人為我,歡迎開源!
 * 
 * 
 * Version: 1.10
 * 
 * Author: NeedJava
 * 
 * E-Mail: 
[email protected]
* * Modified: 2007.08.16/2007.08.29/2007.09.28/2010.03.15 * * * 你可以使用此程式於任何地方,但請保留程式作者及註釋的完整。如果你改進了程式, * * 請在原作者後新增姓名,如:Author: NeedJava/Jack/Mike,版本及修改時間同理。 * ******************************************************************************/ public final class PictureRenamer { public static final int FILE_MIN_LENGTH = 102400; // 查詢檔案的最小位元組數 public static final int SEQUENCE_LENGTH = 3; // 預設圖片序列號的長度 private static final char[] SUFFIX_JPG = { '.', 'j', 'p', 'g' }; // { 46, // 106, // 112, // 103 } private static final char[] SUFFIX_JPEG = { '.', 'j', 'p', 'e', 'g' }; // { // 46, // 106, // 112, // 101, // 103 // } private static final char[] SUFFIX_JPE = { '.', 'j', 'p', 'e' }; // { 46, // 106, // 112, // 101 } private static final char[] SUFFIX_JFIF = { '.', 'j', 'f', 'i', 'f' }; // { // 46, // 106, // 102, // 105, // 102 // } private static final char[] SUFFIX_TIF = { '.', 't', 'i', 'f' }; // { 46, // 116, // 105, // 102 } private static final char[] SUFFIX_TIFF = { '.', 't', 'i', 'f', 'f' }; // { // 46, // 116, // 105, // 102, // 102 // } private static final char PRI_SEPARATOR = '-'; // 45 主要分隔符 private static final char PRI_SUB_SEPARATOR = '.'; // 32 次要分隔符 private static final char SUB_SEPARATOR = ' '; // 32 次要分隔符 private int minLength; // 處理圖片的最小位元組數 private int sequenceLength; // 圖片序列號的長度 private int totalFolders; // 資料夾總數 private int totalFiles; // 檔案總數 private int totalPictures; // 圖片總數 private int parsedPictures; // 含有有效時間的圖片總數 private int renamedPictures; // 成功修改名稱的圖片總數 /*************************************************************************** * * 建構函式,預設使用當前路徑,不搜尋100KB以下圖片 * * 由ACDSee剪裁生成的圖片,仍然保留著詳細的EXIF資訊,哪怕圖片只有一個畫素, * * 但是這樣的圖片有意義嗎?我覺得既然是數碼相片,至少應該大於100KB。 * * 當圖片大小小於一定值時不予理會,當然你可以取消這樣的限制 * **************************************************************************/ public PictureRenamer() { this(FILE_MIN_LENGTH, SEQUENCE_LENGTH); } public PictureRenamer(int minLength, int sequenceLength) { this.totalFolders = 0; this.totalFiles = 0; this.totalPictures = 0; this.parsedPictures = 0; this.renamedPictures = 0; this.minLength = (minLength < 0 ? FILE_MIN_LENGTH : minLength); this.sequenceLength = (sequenceLength < 0 ? SEQUENCE_LENGTH : sequenceLength); } /*************************************************************************** * * 列出當前目錄下的檔案列表,包括檔案和資料夾 * * Windows作業系統中,File類中關鍵是抽象類FileSystem,而FileSystem關鍵如下: * * public static native FileSystem getFileSystem(); * * 實際返回的是子類Win32FileSystem * **************************************************************************/ public final void listPictures(File parent, String fileName) throws FileNotFoundException, IOException { File file = new File(parent, fileName); if (file.isDirectory()) { totalFolders++; String[] children = file.list(); if (children == null) { return; } // java.util.Arrays.sort( children ); //沒必要排序 for (int i = 0; i < children.length; i++) { listPictures(file, children[i]); } } else { totalFiles++; char[] suffix = getPictureSuffix(fileName); if (suffix == null) { return; } if (suffix.length > 0) // 當前檔案是圖片 { totalPictures++; // logger( "/r/nProcess/t[" + file.getPath() + "]", false ); // TODO:增加觀察者,代替logger,使用執行緒wait和notify // TODO:判斷是否是格式化過的圖片,如果是,就退出,或者強制修改。XXXX:放棄這個,因為AcdSee處理的經常是錯的 long length = file.length(); if (length < minLength) { /* * logger( length + " is less than " + * minLength + " bytes, Ignore.", false * ); */ return; } char[] datetime = getPictureDateTime(file); if (datetime == null) { return; } // fileName.substring( 0, fileName.length() - suffix.length // ).toCharArray(); if (datetime.length == 19/**/) // 註釋掉這行,就可以按序列號重新排序命名 { parsedPictures++; String newName = rename(parent, file, fileName, datetime, suffix, 0/*-1*/); // 檢查新檔名是否被佔用,如果沒被佔用,就修改名稱 if (newName == null) { /* * logger( "Rename/t[" + newName + * "]/tFailed", false ); */ return; } renamedPictures++; // logger( "Rename/t[" + newName + "]/tSucceed", false ); } } } } /*************************************************************************** * * 根據字尾名判斷是否是有效的圖片,並且返回小寫的字尾名 * * lastIndexOf()和substring()可以完成,但是我還想把字尾名小寫,並且減少無謂迴圈 * **************************************************************************/ private final char[] getPictureSuffix(String fileName) { if (fileName == null) { return null; } int pointer = fileName.length() - 1; if (pointer > 2) // 可能存在“.jpg”這樣的檔案,即檔名只有4個字元 { char c = fileName.charAt(pointer--); if (c == 'g' || c == 'G') // 1 { c = fileName.charAt(pointer--); if (c == 'p' || c == 'P') // 2 { c = fileName.charAt(pointer--); if ((c == 'j' || c == 'J') && (pointer > -1)) // 3 { if (fileName.charAt(pointer) == '.') { return SUFFIX_JPG; } // 4 } } else if (c == 'e' || c == 'E') // 2 { c = fileName.charAt(pointer--); if (c == 'p' || c == 'P') // 3 { c = fileName.charAt(pointer--); if ((c == 'j' || c == 'J') && (pointer > -1)) // 4 { if (fileName.charAt(pointer) == '.') { return SUFFIX_JPEG; } // 5 } } } } else if (c == 'e' || c == 'E') // 1 { c = fileName.charAt(pointer--); if (c == 'p' || c == 'P') // 2 { c = fileName.charAt(pointer--); if ((c == 'j' || c == 'J') && (pointer > -1)) // 3 { if (fileName.charAt(pointer) == '.') { return SUFFIX_JPE; } // 4 } } } else if (c == 'f' || c == 'F') // 1 { c = fileName.charAt(pointer--); if (c == 'i' || c == 'I') // 2 { c = fileName.charAt(pointer--); if (c == 'f' || c == 'F') // 3 { c = fileName.charAt(pointer--); if ((c == 'j' || c == 'J') && (pointer > -1)) // 4 { if (fileName.charAt(pointer) == '.') { return SUFFIX_JFIF; } // 5 } } else if ((c == 't' || c == 'T') && (pointer > -1)) // 3 { if (fileName.charAt(pointer) == '.') { return SUFFIX_TIF; } // 4 } } else if (c == 'f' || c == 'F') // 2 { c = fileName.charAt(pointer--); if (c == 'i' || c == 'I') // 3 { c = fileName.charAt(pointer--); if ((c == 't' || c == 'T') && (pointer > -1)) // 4 { if (fileName.charAt(pointer) == '.') { return SUFFIX_TIFF; } // 5 } } } } } return null; } /*************************************************************************** * * 解析出圖片中儲存的照相時間 * * * 正常相片(Normal),時間格式如下: * * 2001:01:02 12:23:56[NULL]2001:01:02 12:23:56 * * 一般都是400到800位元組之間,極個別在200和1500左右 * * 還有些相機(如HP PhotoSmart R607)竟然在3100左右 * * * 特殊相片(Special),如富士系列相片FUJIFILM,時間格式如下: * * <exif:DateTimeOriginal>2006-12-24T13:55:42+08:00</exif:DateTimeOriginal> * * 一般在8000以內任意地方,非常臃長 * * * 綜上考慮,我不得不用10240來代替原來的2048 * * 或者我可以使用分段方法,將出現最多的段放在前面,最少的段放後面,我需要統計 * * 現在我遇到的最大的為16000,也就是從2500到16000都有,很少,所以忽略了 * * 現在已經分段了 * **************************************************************************/ private final char[] getPictureDateTime(File file) throws FileNotFoundException, IOException { FileInputStream fis = new FileInputStream(file); // ////////////////////////////////////////////////////////////////////// // // 時間資訊全在檔案前10240位元組內,我們一次讀入,一個一個位元組分析, // // 但是當需要讀入的內容大於10240位元組時,最好分批讀入,每次2048或1024 // // ////////////////////////////////////////////////////////////////////// byte[] buffer = new byte[2048]; int readLength = 0; int remain = 0; int n = 128; // 為防止溢位,而且沒必要搜尋最初的128位元組 int readTimes = 8; // readTimes和buffer.length的乘積應當在10000至16000左右,保證只搜尋圖片前16000位元組 int foundTimes = 0; // 找到有效時間的次數,我們使用第二次找到的時間 int foundOffset = 0; // 在哪找到的 byte tailByte = 0; // 從當前位置向後偏移18,就是時間的最後一位,判斷字元是否符合要求 while (--readTimes >= 0 && (readLength = fis.read(buffer, remain, buffer.length - remain) + remain) >= 0) { // ////////////////////////////////////////////////////////////////// // // 為速度,不準備轉換成char,直接比較數字,如下: // // NULL 0 // // - 45 // // 0 48 // 1 49 // 2 50 // 3 51 // 4 52 // 5 53 // 6 54 // 7 55 // 8 56 // 9 57 // / 47 // : 58 // // 空格 32 // // T 84 // t 116 // // D 68 // d 100 // // O 79 // o 111 // // ////////////////////////////////////////////////////////////////// while ((remain = readLength - n) > 0) { if (remain <= 38 && n >= 19) // 快要到末尾了,把剩餘的位元組複製到頭部,我們重新開始 { System.arraycopy(buffer, n -= 19, buffer, 0, remain += 19); foundOffset += n; n = 0; break; } tailByte = buffer[n + 18]; // 末尾是數字 if (tailByte > 47 && tailByte < 58) { // 必須是數字開頭,並且時鐘與分鐘、分鐘與秒鐘之間是“:” if (buffer[n] > 47 && buffer[n] < 58 && buffer[n + 16] == 58 && buffer[n + 13] == 58) { // 日期與時間分隔的是空格“ ”,並且年與月、月與日之間是“:”,也就是2006:06:06 06:06:06 if (buffer[n + 10] == 32 && buffer[n + 7] == 58 && buffer[n + 4] == 58) { foundTimes++; // Normal,兩個時間在一起,或是第二次找到的時間 if ((buffer[n + 36] == 58 && buffer[n + 33] == 58 && buffer[n + 30] == 32 && buffer[n + 27] == 58 && buffer[n + 24] == 58) || (foundTimes == 2)) { foundOffset += n; // System.err.println( foundOffset ); fis.close(); return parseDateTime(buffer, n, 19); } } // 日期與時間分隔的是“T”或“t”,並且年與月、月與日之間是“-”,也就是2006-06-06T06:06:06 else if ((buffer[n + 10] == 84 || buffer[n + 10] == 116) && buffer[n + 7] == 45 && buffer[n + 4] == 45) { foundTimes++; // Special,含有“DateTimeOriginal”,只判斷“D”或“d”、“T”或“t”、“O”或“o”三個字元 if ((buffer[n - 9] == 79 || buffer[n - 9] == 111) && (buffer[n - 13] == 84 || buffer[n - 13] == 116) && (buffer[n - 17] == 68 || buffer[n - 17] == 100)) { foundOffset += n; // System.err.println( foundOffset ); fis.close(); return parseDateTime(buffer, n, 19); } } } // 別忘了移位 n++; } // 末尾是“:”,向後移動2位 else if (tailByte == 58) { // ////////////////////////////////////////////////////////// // // [ CANON 42 H 2006:12:24 12:33:08 2006:12:24 12:33:08 ] // | // [ // <exif:DateTimeOriginal>2006-12-24T12:33:08+08:00</exif:DateTimeOriginal>] // | // 0000:00:00 00:00:0A // | // 0000-00-00T00:00:0A // | // 0000:00:00 00:00:0A // | // 0000-00-00T00:00:0A // // ////////////////////////////////////////////////////////// n += 2; } // 末尾是空格“ ”、“T”、“t”,向後移動8位 else if (tailByte == 32 || tailByte == 84 || tailByte == 116) { // ////////////////////////////////////////////////////////// // // [ CANON 42 H 2006:12:24 12:33:08 2006:12:24 12:33:08 ] // | // [ // <exif:DateTimeOriginal>2006-12-24T12:33:08+08:00</exif:DateTimeOriginal>] // | // 0000:00:00 00:00:0A // | // 0000-00-00T00:00:0A // | // 0000:00:00 00:00:0A // | // 0000-00-00T00:00:0A // // ////////////////////////////////////////////////////////// n += 8; } // 末尾是“-”,向後移動11位 else if (tailByte == 45) { // ////////////////////////////////////////////////////////// // // [ // <exif:DateTimeOriginal>2006-12-24T12:33:08+08:00</exif:DateTimeOriginal>] // | // 0000-00-00T00:00:0A // | // 0000-00-00T00:00:0A // // ////////////////////////////////////////////////////////// n += 11; } // 末尾不包含以上任何字元,整塊向後移動19位 else { // ////////////////////////////////////////////////////////// // // [ CANON 42 H 2 f light 24 F 55 ] // | | // 0000-00-00T00:00:0A | // | // 0000-00-00T00:00:0A // // ////////////////////////////////////////////////////////// n += 19; } } } fis.close(); return null; } /*************************************************************************** * * 將已經定位好的日期時間提取出來 * **************************************************************************/ private final char[] parseDateTime(byte[] buf, int off, int len) { if (buf == null || off < 0 || len < 0 || off + 1 > buf.length || off + len > buf.length) { return null; } char[] array = new char[len]; byte b; for (int i = 0; i < len; i++) { b = buf[off + i]; if (b >= 48/* 0 */&& b <= 57/* 9 */) { array[i] = (char) b; } // 數字,沒有檢查日期合法性 else if (b == 58/* : */ && i <8) { array[i] = PRI_SEPARATOR; } // 由於“:”不能用於檔名,我們用“-”代替 else if (b == 58/* : */ && i > 2) { array[i] = PRI_SUB_SEPARATOR; } else { array[i] = SUB_SEPARATOR; } // NULL值或其他非數值用空格代替 } System.out.println(array); return array; } /*************************************************************************** * * 檢查新檔名稱是否已被佔用,如果沒被佔用,則修改名稱 * **************************************************************************/ private final String rename(File parent, File file, String name, char[] prefix, char[] suffix, int number) { if (parent == null || file == null || prefix == null || suffix == null) { return null; } char[] array = new char[64/**/]; // ////////////////////////////////////////////////////////////////////// int pointer = array.length - suffix.length; System.arraycopy(suffix, 0, array, pointer, suffix.length); // [ .jpg] if (number > 0/*-1*/) { pointer = writeNumberSequence(array, --pointer, number); // [ // 001.jpg] array[pointer] = SUB_SEPARATOR/**/; // [ _001.jpg] } int temp = pointer = pointer - prefix.length; System.arraycopy(prefix, 0, array, pointer, prefix.length); // [2008-01-01 // 01-01-01_001.jpg] // System.out.println( "Get new file name: " + new String( array, // pointer, array.length - pointer ) ); // ////////////////////////////////////////////////////////////////////// if (array.length - temp == name.length()) { for (int i = 0; temp < array.length; temp++, i++) { // 從pointer的點開始字元比較 if (array[temp] != name.charAt(i)) { break; } } } if (temp == array.length) { return null/**/; } // 如果圖片已經改好了,不需要再次修改 // ////////////////////////////////////////////////////////////////////// String newName = new String(array, pointer, array.length - pointer); File newFile = new File(parent, newName); if (newFile.exists()) { return rename(parent, file, name, prefix, suffix, number + 1); } // 已經存在同名但本質不同的圖片 else if (file.renameTo(newFile)) { return newName; } // 改名成功,測試發現renameTo很耗時間 return null; } /*************************************************************************** * * 得到諸如001、002、012、569、999、0102、1345、4567、56789這樣的數字序列 * **************************************************************************/ private final int writeNumberSequence(char[] array, int offset, int number) { if (array == null || offset < 0 || number < 0) { return offset; } int i = 0, pointer = offset, temp = number; for (; i < sequenceLength; i++, temp /= 10) { array[pointer--] = (char) (temp % 10 + 48); // 48是'0'的ASCII碼 } for (; temp > 0; temp /= 10) { array[pointer--] = (char) (temp % 10 + 48); // 48是'0'的ASCII碼 } return pointer; } public final int getTotalFolders() { return totalFolders; } public final int getTotalFiles() { return totalFiles; } public final int getTotalPictures() { return totalPictures; } public final int getParsedPictures() { return parsedPictures; } public final int getRenamedPictures() { return renamedPictures; } /*************************************************************************** * * 既向控制檯顯示,又向日志寫入 * **************************************************************************/ private final static void logger(String message, boolean both) { if (message == null || message.length() < 1) { return; } if (both) { System.out.println(message); } System.err.println(message); } public static void main(String[] args) { try { System.setErr(new PrintStream(new FileOutputStream("log.txt"))); long start = System.currentTimeMillis(); PictureRenamer rpodt = new PictureRenamer(10240, 3); rpodt.listPictures(null, "img"); logger("/r/n共有資料夾:" + (rpodt.getTotalFolders()) + "個", true); logger("/r/n共有檔案:" + (rpodt.getTotalFiles()) + "個", true); logger("/r/n共有圖片:" + (rpodt.getTotalPictures()) + "張", true); logger("/r/n有效圖片:" + (rpodt.getParsedPictures()) + "張", true); logger("/r/n修改成功:" + (rpodt.getRenamedPictures()) + "張", true); logger("/r/n修改失敗:" + (rpodt.getParsedPictures() - rpodt.getRenamedPictures()) + "張", true); logger("/r/n總共耗時:" + (System.currentTimeMillis() - start) + "毫秒", true); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }

相關推薦

工具批量修改照片名字

同步照片的時候,發現照片名字不規則 。 以下類產生的格式 2014-04-20 09.44.43.jpg import java.io.File; import java.io.IOException; import java.io.PrintStream; import

工具批量修改檔名

因為要讀取樣本,樣本命名一般要按照某一規律。終於找到一種相對方便的方法了~ 1.選中全部要改名的檔案。右鍵重新命名。 2. 比如說我要把名字修改為p+序號的形式。那就重新命名時輸入“p”,回

自己寫段程式碼批量修改照片的Exif資料

老爸老媽去歐洲畫了一個圈,帶回來一千多張照片(數量沒法和年輕人比)。雖然老爸曉得調節相機中的時間,但是畢竟年歲不饒人,整差了12個小時。也就是下午4點拍的照片,Exif裡顯示是凌晨4點。好在歐洲大陸都用相同的時區(偶沒去過,不曉得,只是老爸說導遊都是這樣執行的),每張都 +1

利用IO流中File 批量修改檔名

將上述檔案改名為 有序且具有核心關鍵字的檔名<span style="font-size:18px;">package cn.itcast_05; import java.io.File;

C++批量修改名字

為了實驗方便,需要為實驗資料檔案的名字新增一些標註。為了方便地新增或修改檔名標註,所以寫了這個程式。 實驗資料來自CMU Graphics Lav Motion Capture Database。 其中的檔名為:01_01.amc, 前兩位是兩個數字,代表這條運動資料的表演

Windows CMD 批量修改檔案包括照片,文件,資料夾名字

1, 名字隨便起的! 跟Linux一樣。Cd 可以進入你想進去的目錄! dir命令檢視目錄下的檔案列表,檢視該目錄下的所有檔案: dir /a。就可以查詢到啦! 2,進入裡面,任意找一個照片。先右鍵檢視屬性,複製路徑。用瀏覽器開啟,就可以看到! Ct

OGG運維優化腳本(六)-信息修改--批量取消註釋

ogg oracle goldengate 腳本 數據同步 shell 文件名:recomment.sh路徑: $HOME/ggscript/ggcomment功能:該腳本用於批量取消註釋,配合批量註釋腳本使用,基本功能相反,操作步驟完全一致。通過edit腳本選擇使用日誌路徑:$HOM

OGG運維優化腳本(五)-信息修改--批量註釋

ogg oracle goldengate 腳本 數據同步 shell 文件名:comment.sh路徑:$HOME/ggscript/ggcomment功能:該腳本基於CBS用戶每月大批量註釋源端表進行數據清理的需求而設計通過edit腳本選擇並調用日誌路徑:$HOME/gglog/g

mysql表名等大小寫敏感問題、字段型timestamp、批量修改表名、oracle查詢歷史操作記錄等

table 時間 lar 內容 sele values 當前日期 load 兩個 mysql表名等大小寫敏感問題:http://blog.csdn.net/postnull/article/details/72455768; 1 MySQL在Linux下數據庫名、表名、

python 批量修改數字的文件名

Coding itext imp == 文件夾 起名字 文件名 所有 批量修改 今天碰到一個小問題,下載音頻的時候,文件名的名字變成了數字,排序呢,是按照數字的大小往下排的。 想自己給它們重新起名字,但是又不打亂音頻的順序。好吧,那就自己寫寫代碼吧。 思路就是遍歷音頻文

根據文件名字獲取文件的前綴和後綴的工具

oid pos pub style ava span bsp 字符串 als FileNameUtil.java package com.tyust.common; import org.junit.Test; /** * 獲取文件後綴前綴的工具類

獲取一個臨時文件和對中文文件名字進行編碼的工具

臨時工 進行 fff ima odi fileutil sta 先生 java      首先我們明白,一個文件可以命名為任何名稱,比如一個excel,我們可以命名為不帶後綴,然後向裏面寫入對應的內容,只是在導出的時候將文件命名為正確的名字即可。   一個在當前用

palo資料庫小批量http上傳資料工具

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.URI; import java.ut

自動生成名字工具,copy即可用

public class CharUtil { /** * 將字串轉換成相應的字元編碼 * @param s * @return */ public static String bytes2HexString(Strin

批量修改名字的指令碼

因為leetcode寫到了三位數的題目,和之前兩位數的題目的順序就發生了衝突,所以想在前面補上0,讓最前面的數字是4個: import os """ 用途:在題目開頭補上若干個0使其開頭數字為4個 """ def countStartnum(s): count = 0 for i in

批量修改資料夾JPEGImages中圖片的名字 為voc2007資料集要求的格式

#-*-coding:utf-8-*- import os path_0 = "./**" i=1 for item in os.listdir(path_0): old_name = os.path.join(path_0,item) new_name = os.path.

傻瓜小工具-用python批量修改檔名

本文案例是批量修改音訊檔案,簡單修改也可用於批量修改圖片、視訊等的其他檔案,這個功能對於有收藏癖,同時又有強迫症的宅男,可以說是非常實用(因為我就是案例)。新手上路,老司機勿噴。作為小白,我暫時還寫不出非常強壯、高階的程式碼的,但是幸好,“人生苦短,我用python。”所以簡

CnCrypt 檔案屬性批量修改工具,通過修改檔案屬性達到更好的偽裝效果

檔案屬性修改工具是一款用於檔案屬性修改的工具,可以非常方便的幫助您修改檔案或者資料夾的日期時間等屬性,軟體同時支援批量修改檔案的日期和時間,區域性修改日期/時間。對於一些需要修改檔案日期的朋友來說有非

Java批量修改多級目錄下的圖片名字

public class Test {public static void main(String[] args) {  java.io.File file=new java.io.File("D:/001/");  String dirfile=file.getAbso

批量修改指定資料夾及其子檔案下所有檔案的名字

一個可以修改指定目錄下所有包含關鍵字的檔名稱的java小程式。 import java.io.File; /** * 高山仰止,景行行止;雖不能至,心嚮往之。 * * Create by w