⑴ 求完全同步文件夹的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、更多交流参考我空间文章。