⑴ 求完全同步文件夾的bat批處理命令
@echo off & title 文件備份及比對工具 By 依夢琴瑤
::設置A目錄路徑
set A=E:同步
::設置B目錄路徑
set B=S:同步
::設置C目錄路徑
set C=E:冗餘
echo 說明:
echo 此工具在比對移動時,遇見同名文件,會在新文件名字後加上 _yyyymmddhhmmss
echo 格式的年月日時分秒。本工具同時會比對文件夾,重命名格式同文件一樣。
echo,
echo 日誌文件命名方式為 yyyymmddhhmmss.txt 格式的年月日時分秒.txt。
echo 日誌內容中 -^> 前面的為原始文件路徑,後面的為最終位置的路徑。
echo,&echo,
setlocal enabledelayedexpansion
Call :GetABFullPath "%A%" "%B%" "%C%"
if exist "%SystemRoot%System32choice.exe" goto c2
echo,&set /p choice=請按 Y 鍵開始備份,按其它任意鍵(包括回車鍵)退出,回車確認:
if /i "%choice%"=="Y" goto start
exit
:c2
echo,&choice /c YN /n /m "按 Y 鍵開始備份,按 N 鍵退出:"
if errorlevel 2 exit
if errorlevel 1 goto start
exit
:start
set YMD=%date:~,10%
set YMD=%YMD:/=%
set YMD=%YMD:-=%
set HMS=%time:~,8%
set HMS=%HMS: =0%
set HMS=%HMS::=%
echo,&echo 正在備份中,請耐心等待。。。
(echo 從 "%B%" 備份到 "%A%" 中的文件/文件夾:
echo,
x /s/e/y/d/h/f "%B%" "%A%")>"%C%\%YMD%%HMS%.txt"
ping 127.0.1 -n "2">nul
echo,&echo 正在比對中,請耐心等待。。。
(echo,&echo,&echo,
echo 從 "%A%" 移動到 "
⑵ UE 文件夾和文件操作
UE有很多針對多平台的操作,其中文件操作也屬於跨平台有差異的操作,UE4將跨平台文件封裝在FPlatformFileManager::Get().GetPlatformFile()之中
如果沒有耐心看細節,只想搬磚就看這里吧
以我的工程myproject為例
先來個常規四件套
CreateDirectoryTree
FPlatformFileManager::Get().GetPlatformFile().CreateDirectoryTree通過調用InternalCreateDirectoryTree,遞歸的創建所有的目錄,就是說,即使父目錄不存在,也會生成相應的目錄。
CreateDirectory
這個函數在IPlatformFile中沒有實現,是由具體的平檯子類實現的,也就是說這個函數才是真的創建目錄的函數,這個函數在父目錄不存在的時候,會返回false。
通過拷貝增加文件夾CopyDirectoryTree
/**
DeleteDirectoryRecursively
DeleteDirectoryRecursively通過FDirectoryVisitor,使用迭代器訪問文件夾,然後將文件夾中的文件和文件夾全部刪除,這個操作是CreateDirectoryTree的逆操作,不同點在於這個操作同時處理了文件。
這個操作執行之後會自己檢查剛才刪除的文件夾是否還在,如果不在的話,返回成功,否則返回失敗。
DeleteDirectory
對應於CreateDirectory,也沒有實現,是由具體的平檯子類實現的,同樣在刪除失敗之後會報錯。
IterateDirectory
UE4定義了IterateDirectory,這個函數由兩個參數,一個是路徑,一個是對便利到的路徑做操作的Visitor,這個Visitor同樣是只有一個介面,具體實現可以自己寫。通過Visitor 和IterateDirectory的相互調用實現了遞歸操作目錄的目的。
IterateDirectoryRecursively
IterateDirectoryRecursively遍歷文件夾的所有子文件夾,並且通過parallelfor加快了訪問速度,在訪問中對訪問進行寫鎖定,並通過底層機制是否線程安全選擇是否多線程執行,是很不錯的便利文件夾的操作,同時這個訪問也要求重寫訪問到指定目錄之後需要做的操作,這里只需要執行具體操作就可以了。
這個操作也是由平檯子類實現,進行文件存在性檢測,如果不存在就返回false
通過拷貝增加文件CopyFile
拷貝文件到指定路徑,如果拷貝失敗或者目標路徑有同名文件,會返回失敗
DeleteFile
刪除指定的文件,具體實現由平檯子類實現
檢查是否可以修改IsReadOnly
通過IsReadOnly檢查文件是否可以修改,具體實現由平檯子類實現
設置是否可以修改SetReadOnly
通過SetReadOnly設置文件是否可以被修改,具體實現由平檯子類實現
移動文件位置或者修改文件名稱MoveFile
通過MoveFile可以移動文件,如果源路徑和目標路徑的目錄相同,就是修改文件名稱了
讀取文件類容 OpenRead
/** Attempt to open a file for writing. If successful will return a non-nullptr pointer. Close the file by delete'ing the handle. /
virtual IFileHandle OpenWrite(const TCHAR Filename, bool bAppend = false, bool bAllowRead = false) = 0;
/**
* Finds all the files within the given directory, with optional file extension filter
* @param Directory The directory to iterate the contents of
* @param FileExtension If FileExtension is NULL, or an empty string "" then all files are found.
* Otherwise FileExtension can be of the form .EXT or just EXT and only files with that extension will be returned.
* @return FoundFiles All the files that matched the optional FileExtension filter, or all files if none was specified.
/
virtual void FindFiles(TArray<FString>& FoundFiles, const TCHAR Directory, const TCHAR* FileExtension);
/**
* Finds all the files within the directory tree, with optional file extension filter
* @param Directory The starting directory to iterate the contents. This function explores subdirectories
* @param FileExtension If FileExtension is NULL, or an empty string "" then all files are found.
* Otherwise FileExtension can be of the form .EXT or just EXT and only files with that extension will be returned.
* @return FoundFiles All the files that matched the optional FileExtension filter, or all files if none was specified.
/
virtual void FindFilesRecursively(TArray<FString>& FoundFiles, const TCHAR Directory, const TCHAR* FileExtension);
⑶ java:頻繁向同一個文件夾中寫入、刪除文件會有失敗嗎
如果你是windows系統且版本高於xp,你先測試一下單線程循環:
1.flag = 1; create file "temp";
2.create file "test";
3.write flag to file "test";
4.++flag;
5.close file "test";
6.open file "test"; open file "temp",append
7.read from file "test" and write to file "temp";
8.close file "test"
9.delete file "test";
10.goto lable 2;
測試100+試試,你看看最後"temp"文件裡面記錄是不是連續遞增的,看沒有重復數據。
win7及以上版本頻繁讀寫同一個文件很bug,相當bug。
⑷ JAVA中如何用線程讀取一個文件里的數據!
import java.io.*;
class DownThread extends Thread {
//定義位元組數組(取水的竹筒)的長度
private final int BUFF_LEN = 32;
//定義讀取的起始點
private long start;
//定義讀取的結束點
private long end;
//讀取文件對應的輸入流
private InputStream is;
//將讀取到的位元組輸出到raf中
private RandomAccessFile raf;
//構造器,傳入輸入流,輸出流和讀取起始點、結束點
public DownThread(long start, long end, InputStream is, RandomAccessFile raf) {
//輸出該線程負責讀取的位元組位置
System.out.println(start + "---->" + end);
this.start = start;
this.end = end;
this.is = is;
this.raf = raf;
}
public void run() {
try {
is.skip(start);
raf.seek(start);
//定義讀取輸入流內容的的緩存數組(竹筒)
byte[] buff = new byte[BUFF_LEN];
//本線程負責讀取文件的大小
long contentLen = end - start;
//定義最多需要讀取幾次就可以完成本線程的讀取
long times = contentLen / BUFF_LEN + 4;
//實際讀取的位元組數
int hasRead = 0;
for (int i = 0; i < times; i++) {
hasRead = is.read(buff);
//如果讀取的位元組數小於0,則退出循環!
if (hasRead < 0) {
break;
}
raf.write(buff, 0, hasRead);
}
} catch (Exception ex) {
ex.printStackTrace();
}
//使用finally塊來關閉當前線程的輸入流、輸出流
finally {
try {
if (is != null) {
is.close();
}
if (raf != null) {
raf.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
public class MutilDown {
public static void main(String[] args) {
final int DOWN_THREAD_NUM = 4;
final String OUT_FILE_NAME = "d:/勇敢的心.rmvb";
InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];
RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];
try {
isArr[0] = new FileInputStream("d:/勇敢的心.rmvb");
long fileLen = getFileLength(new File("d:/勇敢的心.rmvb"));
System.out.println("文件的大小" + fileLen);
//以輸出文件名創建第一個RandomAccessFile輸出流
outArr[0] = new RandomAccessFile(OUT_FILE_NAME, "rw");
//創建一個與文件相同大小的空文件
for (int i = 0; i < fileLen; i++) {
outArr[0].write(0);
}
//每線程應該讀取的位元組數
long numPerThred = fileLen / DOWN_THREAD_NUM;
//整個文件整除後剩下的余數
long left = fileLen % DOWN_THREAD_NUM;
for (int i = 0; i < DOWN_THREAD_NUM; i++) {
//為每個線程打開一個輸入流、一個RandomAccessFile對象,
//讓每個線程分別負責讀取文件的不同部分。
if (i != 0) {
isArr[i] = new FileInputStream("d:/勇敢的心.rmvb");
//以指定輸出文件創建多個RandomAccessFile對象
outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");
}
if (i == DOWN_THREAD_NUM - 1) {
//最後一個線程讀取指定numPerThred+left個位元組
new DownThread(i * numPerThred, (i + 1) * numPerThred
+ left, isArr[i], outArr[i]).start();
} else {
//每個線程負責讀取一定的numPerThred個位元組
new DownThread(i * numPerThred, (i + 1) * numPerThred,
isArr[i], outArr[i]).start();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static long getFileLength(File file) {
long length = 0;
//獲取文件的長度
long size = file.length();
length = size;
return length;
}
}
⑸ mfc如何使用多線程搜索文件夾
1、根據API中的文件和目錄操作函數構成一個具有遞歸功能的目錄遍歷和文件查找
2、可以根據MFC中對線程的封裝格式,將上述操作放入線程函數中
3、更多交流參考我空間文章。