다음을 통해 공유


작업에 파일 추가

작업에는 전송하려는 파일이 하나 이상 포함되어 있습니다. 다음 방법 중 하나를 사용하여 작업에 파일을 추가합니다.

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 메서드를 호출합니다. Complete 메서드를 호출할 때 BITS는 임시 파일 이름을 대상 파일 이름으로 변경합니다. 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);
}