Добавление файлов в задание
Задание содержит один или несколько файлов, которые требуется перенести. Используйте один из следующих методов для добавления файлов в задание:
-
Добавляет один файл в задание.
-
Добавляет один или несколько файлов в задание. При добавлении нескольких файлов более эффективно вызывать этот метод, чем вызывать метод AddFile в цикле.
-
Добавляет один файл в задание. Используйте этот метод, если вы хотите скачать диапазоны данных из файла. Этот метод можно использовать только для заданий загрузки.
При добавлении файла в задание укажите удаленное имя и локальное имя файла. Дополнительные сведения о формате имен локальных и удаленных файлов см. в 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 является допустимым.
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);
}