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