Как я могу скопировать большой файл в Windows без CopyFile или CopyFileEx?

Ваша функция обновления будет выглядеть так

updateItem(id, itemAttributes) {
  var index = this.state.items.findIndex(x=> x.id === id);
  if (index === -1)
    // handle error
  else
    this.setState({
      items: [
         ...this.state.items.slice(0,index),
         Object.assign({}, this.state.items[index], itemAttributes),
         ...this.state.items.slice(index+1)
      ]
    });
}

И вы используете ее так

this.updateItem(2, {someattr: 'a new value'});

Gross right?


Но у вас будет большая головная боль вообще, если вы продолжите строить сложное приложение таким образом. Вы действительно должны изучить redux или другую реализацию Flux, которая лучше подходит для решения этих проблем.

Redux использует концепцию редукторов состояния, каждая из которых работает на определенном фрагменте состояние вашей заявки. Таким образом, вам не нужно вручную копать все ваше состояние каждый раз, когда вы хотите повлиять на глубокие изменения.

Создатель Redux, Дэн Абрамов, сделал два видеокурса онлайн бесплатно. Дэн - отличный учитель, и я чувствовал себя комфортно с рисунком Редукса, проведя всего один день с ним.

9
задан skaffman 7 October 2009 в 06:43
поделиться

2 ответа

Наилучший вариант состоит в том, чтобы просто открыть исходный файл для чтения, целевой файл для записи и затем цикла, копируя его блок блоком. В псевдокоде:

f1 = open(filename1);
f2 = open(filename2, "w");
while( !f1.eof() ) {
  buffer = f1.read(buffersize);
  err = f2.write(buffer, buffersize);
  if err != NO_ERROR_CODE
    break;
}
f1.close(); f2.close();

[Редактирование Аскером] хорошо, это - то, как это смотрит в C# (это медленно, но это, кажется, работает хорошо, и это дает прогресс):

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace LoopCopy
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine(
                  "Usage: LoopCopy.exe SourceFile DestFile");
                return;
            }

            string srcName = args[0];
            string destName = args[1];

            FileInfo sourceFile = new FileInfo(srcName);
            if (!sourceFile.Exists)
            {
                Console.WriteLine("Source file {0} does not exist", 
                    srcName);
                return;
            }
            long fileLen = sourceFile.Length;

            FileInfo destFile = new FileInfo(destName);
            if (destFile.Exists)
            {
                Console.WriteLine("Destination file {0} already exists", 
                    destName);
                return;
            }

            int buflen = 1024;
            byte[] buf = new byte[buflen];
            long totalBytesRead = 0;
            double pctDone = 0;
            string msg = "";
            int numReads = 0;
            Console.Write("Progress: ");
            using (FileStream sourceStream = 
              new FileStream(srcName, FileMode.Open))
            {
                using (FileStream destStream = 
                    new FileStream(destName, FileMode.CreateNew))
                {
                    while (true)
                    {
                        numReads++;
                        int bytesRead = sourceStream.Read(buf, 0, buflen);
                        if (bytesRead == 0) break; 
                        destStream.Write(buf, 0, bytesRead);

                        totalBytesRead += bytesRead;
                        if (numReads % 10 == 0)
                        {
                            for (int i = 0; i < msg.Length; i++)
                            {
                                Console.Write("\b \b");
                            }
                            pctDone = (double)
                                ((double)totalBytesRead / (double)fileLen);
                            msg = string.Format("{0}%", 
                                     (int)(pctDone * 100));
                            Console.Write(msg);
                        }

                        if (bytesRead < buflen) break;

                    }
                }
            }

            for (int i = 0; i < msg.Length; i++)
            {
                Console.Write("\b \b");
            }
            Console.WriteLine("100%");
            Console.WriteLine("Done");
        }
    }
}
14
ответ дан 4 December 2019 в 10:34
поделиться

Если Вы хотите написать код, один способ, которым можно оптимизировать, отправляет файл в блоках (как использование MTOM). Я использовал этот подход для отправки вниз огромных файлов от DataCenter вниз в наш офис для печати..

Кроме того, проверьте утилиту TeraCopy, упомянутую здесь..

6
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: