Добавление файла и связывание его с существующим файлом в хранилище
Вам может потребоваться добавить файл и связать его с уже существующим в хранилище. Этот пример на VB.NET показывает как выполнить эту задачу. Пример добавляет файл Excel с диска к текстовому файлу в хранилище.
connection.FileManager.AddFile() используется для добавления файла с диска в хранилище.
connection.FileManager.AcquireFiles() используется для проверки файла, к которому присоединяется файл. (он проверяется без загрузки на компьютер).
connection.FileManager.GetFileAssociationLites() используется для получения связей существующего файла. Новый FileAssocParam используется для добавления присоединенного файла. Присоединенные файлы добавляются как параметры к методу connection.FileManager.CheckinFile.
Метод CheckinFile имеет две подписи. Одна, с байтовым параметром System.IO.Stream, используется для получения файла, который не был загружен (Параметр равен Nothing).
Объект связи: Autodesk.DataManagement.Client.Framework.Vault.Currency.Connections.Connection
Для получения присоединенных файлов вы можете использовать функцию GetFileAssociationsByIds из WebService. Было выяснено, что GetFileAssociationLites() работает лучше, если есть большое количество присоединенных файлов, она-то и используется в примере (использование GetFileAssociationsByIds() в примере указано в комментариях).
Примечание: Текущая версия Vault API не поддерживает добавление САПР-файлов, таких как сборки Autodesk Inventor. Также было замечено, что вставка файла к .idw может неблагоприятно влиять на файл dwf, который прикреплен как вложение визуализации (файл dwf становится вложением и должен быть пересоздан - это происходит при получении idw при помощи надстройки Vault на Inventor). Также надстройка Inventor Vault Add-in перечислит все прикрепленные файлы, когда при помощи неё будет производиться возврат всего. Однако, прикрепленный файл может не быть скачан, что приведет к ошибке при возврате.
Скачайте проект Visual Studio: Vault_list_Add_and_Associate.
Пример является обновлением примера VaultList из SDK. В нем есть три новые кнопки. Одна из кнопок будет «добавлять и прикреплять файл».
Код из приложенного проекта:
- Private Sub Button4_Click(sender As System.Object,
- e As System.EventArgs) Handles Button4.Click
- ' В демонстрационных целях информация
- ' задана жестко, прямо в коде.
- Dim results As VDF.Vault.Results.LogInResult =
- VDF.Vault.Library.ConnectionManager.LogIn _
- ("localhost", "Vault", "Administrator", "",
- VDF.Vault.Currency.Connections. _
- AuthenticationFlags.Standard,
- Nothing)
- If Not results.Success Then
- Return
- End If
- Dim connection As _
- VDF.Vault.Currency.Connections.Connection _
- = results.Connection
- ' Необходимо заменить эту строку на
- ' путь к файлу, который вы хотите добавить в хранилище
- Dim filePath As String =
- "C:\Temp\myFile_20.xlsx"
- Dim myFldrCol As System.Collections.Generic.List _
- (Of VDF.Vault.Currency.Entities.Folder)
- myFldrCol = connection.FolderManager. _
- GetChildFolders(connection.FolderManager.RootFolder,
- False, False)
- ' Получите папку для добавления нового файла для изменения
- ' замените FullName test на папку Folder в вашем хранилище
- Dim myFolder As _
- VDF.Vault.Currency.Entities.Folder = Nothing
- For Each Flder As _
- VDF.Vault.Currency.Entities.Folder In myFldrCol
- If Flder.FullName = "$/wB_Excel_Files" Then
- myFolder = Flder
- Exit For
- End If
- Next
- Dim myFileIterationNewFile As _
- VDF.Vault.Currency.Entities.FileIteration = _
- Nothing
- Using fileStream As Stream = New FileStream _
- (filePath, FileMode.Open, FileAccess.Read)
- ' Добавляем файл в хранилище
- myFileIterationNewFile =
- connection.FileManager.AddFile(myFolder,
- Path.GetFileName(filePath),
- "Добавлен по коду wB",
- DateTime.Now, Nothing, Nothing,
- ACW.FileClassification.None,
- False, fileStream)
- End Using
- If Not myFileIterationNewFile Is Nothing Then
- Dim bAddedAttachment As Boolean = False
- ' Необходимо заменить эту строку на путь
- ' к существующему файлу в хранилище
- Dim strNameOfFileToAddTo = "wB_test.txt"
- Dim fldrId As Long =
- myFileIterationNewFile.FolderId
- bAddedAttachment = AddMyAttachment _
- (strNameOfFileToAddTo,
- myFileIterationNewFile.EntityIterationId,
- fldrId, connection)
- If bAddedAttachment = False Then
- MessageBox.Show _
- («Невозможно получить объект FileIteration")
- Else
- MessageBox.Show _
- («Успешно - Файл добавлен и прикреплен")
- End If
- End If
- ' Выход из хранилища
- VDF.Vault.Library.ConnectionManager.LogOut _
- (connection)
- End Sub
- Public Function AddMyAttachment _
- (nameOfFileToAttachTo As String,
- myFileIterationId As Long,
- myFolderIdOfNewFileIteration As Long,
- connection As _
- VDF.Vault.Currency.Connections.Connection) _
- As Boolean
- Dim oFileIteration As _
- VDF.Vault.Currency.Entities.FileIteration =
- getFileIteration(nameOfFileToAttachTo, connection)
- If oFileIteration Is Nothing Then
- MessageBox.Show(" Невозможно получить FileIteration")
- Return False
- End If
- ' Получить настройки
- Dim oSettings As _
- VDF.Vault.Settings.AcquireFilesSettings =
- New VDF.Vault.Settings.AcquireFilesSettings _
- (connection)
- ' Собираемся вернуть (не загрузить файл)
- oSettings.DefaultAcquisitionOption =
- VDF.Vault.Settings.AcquireFilesSettings. _
- AcquisitionOption.Checkout
- ' добавить файл в настройки
- oSettings.AddEntityToAcquire(oFileIteration)
- ' Выполнить возврат файла
- Dim myAcquireVaultSettings As _
- VDF.Vault.Results.AcquireFilesResults
- myAcquireVaultSettings =
- connection.FileManager.AcquireFiles(oSettings)
- Dim oNewFileIteration As _
- VDF.Vault.Currency.Entities.FileIteration
- Dim myFileAcqRes As _
- VDF.Vault.Results.FileAcquisitionResult
- myFileAcqRes =
- myAcquireVaultSettings.FileResults(0)
- oNewFileIteration =
- myFileAcqRes.NewFileIteration
- If oNewFileIteration.IsCheckedOut = True Then
- ' настройки используются в GetFileAssociationLites()
- Dim myFileRelationshipSettings As _
- VDF.Vault.Settings.FileRelationshipGatheringSettings
- myFileRelationshipSettings = _
- New VDF.Vault.Settings.FileRelationshipGatheringSettings
- myFileRelationshipSettings. _
- IncludeAttachments = True
- myFileRelationshipSettings. _
- IncludeChildren = True
- myFileRelationshipSettings. _
- IncludeParents = True
- myFileRelationshipSettings. _
- IncludeRelatedDocumentation = True
- Dim myColOfFileAssocLite As _
- System.Collections.Generic.IEnumerable _
- (Of ACW.FileAssocLite) = Nothing
- myColOfFileAssocLite =
- connection.FileManager.GetFileAssociationLites _
- (New Long() {oNewFileIteration.EntityIterationId},
- myFileRelationshipSettings)
- ' Собираемся добавить новые объекты FileAssocParam
- ' в список
- ' ArrayList для хранения
- ' объектов FileAssocParam
- Dim fileAssocParams As ArrayList =
- New ArrayList
- ' Добавьте объекты FileAssocParam в ArrayList
- ' используя значения из коллекции
- ' из FileAssocLite в коллекции,
- ' возвращенной из GetFileAssociationLites()
- If Not myColOfFileAssocLite Is Nothing Then
- Dim myFileAssocLite As FileAssocLite
- ' Пройти каждый FileAssoLite в
- ' коллекции из FileAssocLite
- For Each myFileAssocLite In
- myColOfFileAssocLite
- ' Это новый FileAssocParam, который
- ' будет добавлен в List
- ' получая свойства
- Dim par As FileAssocParam =
- New FileAssocParam()
- par.CldFileId =
- myFileAssocLite.CldFileId
- par.RefId = myFileAssocLite.RefId
- par.Source = myFileAssocLite.Source
- par.Typ = myFileAssocLite.Typ
- par.ExpectedVaultPath =
- myFileAssocLite.ExpectedVaultPath
- fileAssocParams.Add(par)
- Next
- End If
- ' Получаем папку файла
- ' который мы прикрепляем
- Dim myDictionary As IDictionary _
- (Of Long, VDF.Vault.Currency.Entities.Folder)
- myDictionary =
- connection.FolderManager.GetFoldersByIds _
- (New Long() {myFolderIdOfNewFileIteration})
- ' Получить папку из словаря
- Dim keyPair As Generic.KeyValuePair _
- (Of Long, VDF.Vault.Currency.Entities.Folder)
- keyPair = myDictionary.First
- Dim myFldr As _
- VDF.Vault.Currency.Entities.Folder _
- = keyPair.Value
- ' Добавить новую связь
- Dim newFileAssocPar As _
- FileAssocParam = New FileAssocParam()
- newFileAssocPar.CldFileId = _
- myFileIterationId
- newFileAssocPar.RefId = Nothing
- newFileAssocPar.Source = Nothing
- newFileAssocPar.Typ = _
- AssociationType.Attachment
- newFileAssocPar.ExpectedVaultPath = _
- myFldr.FolderPath
- ' Добавить наш новый FileAssocParam
- fileAssocParams.Add(newFileAssocPar)
- ' Заполняем это новыми объектами FileAssocParam,
- ' которые мы создаем из свойств'
- ' в FileAssocArray и новом файле
- Dim myFileAssocParamArray As FileAssocParam() _
- = DirectCast(fileAssocParams.ToArray _
- (GetType(FileAssocParam)), FileAssocParam())
- ' Используем перегруженный метод CheckInFile,
- ' который получает поток. Это даст возможность
- ' возвращать файл, который не был
- ' загружен
- ' (выполняя передачу в поток, равный Nothing)
- Dim myStream As System.IO.Stream = Nothing
- connection.FileManager.CheckinFile _
- (oNewFileIteration, "wbTesting", False,
- Date.Now,
- myFileAssocParamArray,
- Nothing, False, Nothing,
- ACW.FileClassification.None,
- False, myStream)
- Else
- MessageBox.Show("Невозможно вернуть")
- Return False
- End If
- Return True
- End Function
Обсуждение: http://adn-cis.org/forum/index.php?topic=437
Опубликовано 04.01.2014Отредактировано 08.01.2014 в 11:59:31