如何在10.8中显示文件复制进度

时间:2012-10-03 09:24:49

标签: objective-c macos cocoa macos-carbon nsfilemanager

FSCopyObjectAsync在OS X v10.8中已不推荐使用,现在如何显示文件复制操作的进度指示器。

4 个答案:

答案 0 :(得分:2)

我的回答是假设您正在讨论复制单个文件的进度。

是的,“FSCopyObjectAsync”已被弃用,但尚未消失。

正如您所发现的那样,Apple还没有为最终将被删除的功能提供有用的替代品。我怀疑(但不确定)当新功能出现时,可能是10.9,它将以“NSFileManagerDelegate”协议提供给代表使用。

为了确保这一点,Apple需要意识到有很多开发人员需要这个。在http://bugreporter.apple.com提交错误报告 - 它可能会被重复关闭,但每次投票都很重要。

答案 1 :(得分:2)

copyfile(3)是FSCopyObjectAsync的替代方案。 Here是带有Progress Callback的copyfile(3)的示例。

答案 2 :(得分:0)

使用C

中的进度指示器复制文件
#define BUFSIZE (64*1024)

void *thread_proc(void *arg);
      {
          //outPath & inPatn an NSString paths

          char buffer[BUFSIZE];
          const char * outputFile = [outPath UTF8String];
          const char * inputFile = [inPath UTF8String];
          int in = open(inputFile, O_RDONLY);
          int out = open(outputFile, O_WRONLY | O_CREAT | O_TRUNC);

          vvolatile off_t progress;
          progress = 0;             
          ssize_t bytes_read;
          double fileSize = 0;
          NSNumber * theSize;

          if ([inPath getResourceValue:&theSize forKey:NSURLFileSizeKey error:nil])
                  fileSize = [theSize doubleValue];

          [progressIndicator setMaxValue:fileSize];      
          while((bytes_read = read(in, buffer, BUFSIZE)) > 0)
          {
              write(out, buffer, BUFSIZE);
              progress += bytes_read;

              [progressIndicator setDoubleValue:progress];

          }
          // copy is done, or an error occurred
          close(in);
          close(out);
      }

答案 3 :(得分:0)

我创建了一个解决这个问题的开源项目,我在NSOperation上包装了复制文件(3)并为它创建了一个gui,请检查它,并可能有助于使它更好。

https://github.com/larod/FileCopyDemo

enter image description here