Добавление файлов в задание

Задание содержит один или несколько файлов, которые требуется перенести. Используйте один из следующих методов для добавления файлов в задание:

IBackgroundCopyJob::AddFile

Добавляет один файл в задание.

IBackgroundCopyJob::AddFileSet

Добавляет один или несколько файлов в задание. При добавлении нескольких файлов более эффективно вызывать этот метод, чем вызывать метод AddFile в цикле.

IBackgroundCopyJob3::AddFileWithRanges

Добавляет один файл в задание. Используйте этот метод, если вы хотите скачать диапазоны данных из файла. Этот метод можно использовать только для заданий загрузки.

При добавлении файла в задание укажите удаленное имя и локальное имя файла. Дополнительные сведения о формате имен локальных и удаленных файлов см. в BG_FILE_INFO структуре.

Задание отправки может содержать только один файл. Методы IBackgroundCopyJob::AddFile и IBackgroundCopyJob::AddFileSet возвращают BG_E_TOO_MANY_FILES при попытке добавить несколько файлов в задание отправки. Если вам нужно отправить несколько файлов, рассмотрите возможность использования CAB-файла или ZIP-файла.

Для заданий загрузки BITS ограничивает количество файлов, которые пользователь может добавить в задание до 200 файлов, а также количество диапазонов для файла до 500 диапазонов. Эти ограничения не применяются к администраторам или службам. Чтобы изменить эти ограничения по умолчанию, ознакомьтесь с групповыми политиками.

Владелец задания или пользователя с правами администратора может добавлять файлы в задание в любое время до вызова метода IBackgroundCopyJob::Complete или метода IBackgroundCopyJob::Cancel .

Если после добавления файла в задание необходимо изменить удаленное имя файла, можно вызвать метод IBackgroundCopyJob3::ReplaceRemotePrefix или метод IBackgroundCopyFile2::SetRemoteName . Используйте метод ReplaceRemotePrefix , чтобы изменить часть удаленного имени сервера, если сервер недоступен или позволить перемещаемым пользователям подключаться к ближайшему серверу. Используйте метод SetRemoteName , чтобы изменить протокол, используемый для передачи файла или изменения имени файла или пути.

BITS создает временный файл в целевом каталоге и использует временный файл для передачи файлов. Чтобы получить имя временного файла, вызовите метод IBackgroundCopyFile3::GetTemporaryName . BITS изменяет имя временного файла на имя целевого файла при вызове метода Complete . BITS не указывает дескриптор безопасности при создании временного файла (файл наследует сведения ACL из целевого каталога). Если передаваемые данные конфиденциальны, приложение должно указать соответствующий список ACL в целевом каталоге, чтобы предотвратить несанкционированный доступ.

Чтобы сохранить сведения о владельце и ACL с переданным файлом, вызовите метод IBackgroundCopyJob3::SetFileACLFlags .

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

В следующем примере показано, как добавить один файл в задание. В примере предполагается, что указатель интерфейса IBackgroundCopyJob, pJob , является допустимым.

HRESULT hr;
IBackgroundCopyJob* pJob;

//Replace parameters with variables that contain valid paths.
hr = pJob->AddFile(L"https://ServerName/Path/File.Ext", L"d:\\Path\\File.Ext");
if (SUCCEEDED(hr))
{
  //Do something.
}

В следующем примере показано, как добавить в задание несколько файлов. В этом примере предполагается, что указатель интерфейса IBackgroundCopyJob, pJob , является допустимым, а локальные и удаленные имена поступают из списка в пользовательском интерфейсе.

HRESULT hr;
IBackgroundCopyJob* pJob;
BG_FILE_INFO* paFiles = NULL;
ULONG idx = 0;
ULONG nCount = 0;            //Set to the number of files to add to the job.
LPWSTR pszLocalName = NULL;  //Comes from the list in the user interface.
LPWSTR pszRemoteName = NULL; //Comes from the list in the user interface.

//Set nCount to the number of files to transfer.

//Allocate a block of memory to contain the array of BG_FILE_INFO structures.
//The BG_FILE_INFO structure contains the local and remote names of the 
//file being transferred.
paFiles = (BG_FILE_INFO*) malloc(sizeof(BG_FILE_INFO) * nCount);
if (NULL == paFiles)
{
  //Handle error
}
else
{
  //Add local and remote file name pairs to the memory block. 
  for (idx=0; idx<nCount; idx++)
  {
    //Set pszLocalName to point to an LPWSTR that contains the local name or
    //allocate memory for pszLocalName and copy the local name to pszLocalName.
    (paFiles+idx)->LocalName = pszLocalName;

    //Set pszRemoteName to point to an LPWSTR that contains the remote name or
    //allocate memory for pszRemoteName and copy the remote name to pszRemoteName.
    (paFiles+idx)->RemoteName = pszRemoteName;
  }

  //Add the files to the job.
  hr = pJob->AddFileSet(nCount, paFiles);
  if (SUCCEEDED(hr))
  {
     //Do Something.
  }

  //Free the memory block for the array of BG_FILE_INFO structures. If you allocated
  //memory for the local and remote file names, loop through the array and free the
  //memory for the file names before you free paFiles.
  free(paFiles);
}