我需要从我的Windows C#应用程序加载帮助文件并移动/复制到其他系统(到其本地驱动器).本地系统上的应用程序(相同的C#windows应用程序)将使用它来提供帮助.
要做到这一点需要做些什么?
我理解,File.Copy()但我不知道,它是否也适用于远程系统?
我创建了一个msi安装文件,其中包含一些"Sample"文件夹中的文件,应该将其复制到临时文件夹中.有人建议怎么做?
我内部有一个线程和一个Progress Routine(一个函数)(在我的线程类中).
我尝试在线程内执行此操作:
CopyFileEx(pchar(ListToCopy.Strings[Loop]),pchar(TN+ExtractFileName(ListToCopy.Strings[Loop])), @ProgressRoutine, nil, nil, 0);
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:"需要变量"(错误在于:@ProgressRoutine).如果要在线程外部使函数ProgressRoutine,那么一切都将正常.
如何在线程内使用该函数?
谢谢.
使用Java NIO使用可以更快地复制文件.我发现两种方法主要是通过互联网来完成这项工作.
public static void copyFile(File sourceFile, File destinationFile) throws IOException {
if (!destinationFile.exists()) {
destinationFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destinationFile).getChannel();
destination.transferFrom(source, 0, source.size());
} finally {
if (source != null) {
source.close();
}
if (destination != null) {
destination.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在20个非常有用的Java开发人员Java代码片段中,我发现了一个不同的评论和技巧:
public static void fileCopy(File in, File out) throws IOException {
FileChannel inChannel = new FileInputStream(in).getChannel();
FileChannel outChannel = new FileOutputStream(out).getChannel(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个目录并在一个文件中复制一个文件(pdf)Parallel.ForEach.
下面是一个简单的例子:
private static void CreateFolderAndCopyFile(int index)
{
const string sourcePdfPath = "c:\\testdata\\test.pdf";
const string rootPath = "c:\\testdata";
string folderDirName = string.Format("Data{0}", string.Format("{0:00000000}", index));
string folderDirPath = rootPath + @"\" + folderDirName;
Directory.CreateDirectory(folderDirPath);
string desPdfPath = folderDirPath + @"\" + "test.pdf";
File.Copy(sourcePdfPath, desPdfPath, true);
}
Run Code Online (Sandbox Code Playgroud)
上述方法创建一个新文件夹并将pdf文件复制到新文件夹.它创建了这个目录树:
TESTDATA
-Data00000000
-test.pdf
-Data00000001
-test.pdf
....
-Data0000000N
-test.pdf
Run Code Online (Sandbox Code Playgroud)
我试着CreateFolderAndCopyFile在Parallel.ForEach循环中调用该方法.
private static void Func<T>(IEnumerable<T> docs)
{
int index = 0;
Parallel.ForEach(docs, doc =>
{
CreateFolderAndCopyFile(index);
index++;
});
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,它完成以下错误: …
我在USB记忆棒上使用批处理文件来备份我的照片.我使用以下命令:
for /r C:\ %%x in (*.jpg *.png *.gif) do @copy /y %%x .
Run Code Online (Sandbox Code Playgroud)
我想排除邮件文件夹WINDOWS和PROGRAM FILES中的文件.
有谁知道如何使用批处理文件执行此操作?
我有一个实用程序,通过简单地复制/替换可执行文件来更新应用程序.现在,我有一些需要更新的DLL文件.但是,有时Windows不会让我替换它,因为有些东西正在使用它,有时使用DLL有很多东西,我无法保证它将被解锁为我替换它.
目前,我唯一的解决方法是首先重命名现有的DLL,然后我可以复制新的DLL.但是旧的DLL会因更改的文件名而落后.
在这种情况下如何以编程方式替换DLL?
我有这样的代码:
for file in file_list:
shutil.copyfile(file,newpath)
#do further actions
Run Code Online (Sandbox Code Playgroud)
这是一个问题,在 #do further actions我使用复制的文件时,我需要确保shutil.copyfile函数完成他们的任务.我怎样才能确定这一点?
我正在尝试将我的文件移动到 apache 图像的 htdocs 文件夹中。她是我的 dockerfile 的样子:
FROM httpd:2.4
MAINTAINER Ankit
COPY ./public-html/ /usr/local/apache2/htdocs/
Run Code Online (Sandbox Code Playgroud)
但是 COPY 命令不会将文件复制到容器中。这是输出 - 默认情况下 index.html 在那里,我要复制的是 public-html 文件夹:
root@8453b6ffa6fd:/usr/local/apache2/htdocs# ls
index.html
Run Code Online (Sandbox Code Playgroud)
有什么我想念的吗?
更新:public-html 文件夹没有被复制,但文件 index.html 被复制到那里,这种行为的原因是什么?
UPDATE2:这是我最新的 dockerfile,用于构建和运行容器的命令。
Dockerfile:
FROM httpd:2.4
MAINTAINER Ankit
COPY public-html/ /usr/local/apache2/htdocs/public-html/
docker build -f Dockerfile -t apache .
docker run -d --name apws -v /Users/ankitsahu/workspace/docker_practi
ce/public-html:/usr/local/apache2/htdocs/ -p 80:80 apache
Run Code Online (Sandbox Code Playgroud)
当我使用 exec 命令检查内容时:
root@b54e53a231b7:/usr/local/apache2/htdocs# ls -a
. .. index.html sample.html try
Run Code Online (Sandbox Code Playgroud) Windows API函数CopyFileEx允许指定回调函数,然后在复制文件的一部分时调用该函数,例如向用户提供有关进度的反馈.
这在我的程序中工作正常,但我现在有一个额外的要求:我需要暂时暂停复制过程,以便将系统负载保持一段时间(可能长达几个小时),然后恢复它.这可能在任何时候发生,通常有一个大型文件(几个100千兆字节),只是部分复制,所以中止该过程并重新启动它不是一个好的选择,因为这意味着可能99%的文件,已被复制,需要再次复制.
这样做的一个选择就是在调用回调时让执行副本的线程休眠,例如
function ProgressCallback(
_TotalFileSize, _TotalBytesTransferred, _StreamSize,
_StreamBytesTransferred: LARGE_INTEGER;
_StreamNumber, _CallbackReason: LongWord;
_SourceFile, _DestinationFile: THandle; _Data: Pointer): LongWord;
far; stdcall;
begin
// [...]
while gblPauseFlag do
sleep(100);
end;
Run Code Online (Sandbox Code Playgroud)
(这当然是简化的代码.原始版本太复杂了,无法在此处发布.)gblPauseFlag将由应用程序中的另一个线程设置和重置,该线程检查要暂停的条件.
我知道有更好的方法来暂停线程(事件,关键部分或其他),但这里的问题只是:在回调函数中暂停复制线程是否安全?或者它会阻止一些Windows功能或资源?
从示例代码中可以看出,这是一个Delphi程序,但我认为这并不重要,所以我没有将问题标记为[delphi].
编辑:我可以传递标志COPY_FILE_RESTARTABLE,但是:
如果复制失败,将在目标文件中跟踪副本的进度.通过为失败的调用中使用的lpExistingFileName和lpNewFileName指定相同的值,可以在以后重新启动失败的副本.这可能会显着减慢复制操作,因为在复制操作期间可能会多次刷新新文件.
来源:CopyFileEx文档
所以我宁愿尽量避免这种情况.
file-copying ×10
c# ×2
delphi ×2
apache ×1
batch-file ×1
delphi-xe2 ×1
dll ×1
docker ×1
java ×1
nio ×1
python ×1
shutil ×1
winapi ×1
wix ×1