작업에 파일 추가
작업에는 전송하려는 파일이 하나 이상 포함되어 있습니다. 다음 방법 중 하나를 사용하여 작업에 파일을 추가합니다.
-
작업에 단일 파일을 추가합니다.
-
작업에 하나 이상의 파일을 추가합니다. 여러 파일을 추가하는 경우 루프에서 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);
}