EDSDK, C#: Попытка получить список файлов на камере
Я пишу приложение на C#, которое использует EDSDK для взаимодействия цифровой камеры с ПК. Пользователь щелкает картинку; это вызывает событие в программном обеспечении; а затем программное обеспечение копирует изображение нового изображения на ПК. Это прекрасно работает.
Теперь я хотел бы, чтобы программное обеспечение могло корректно обрабатывать сценарии, когда ПК недоступен или камера как-то теряет связь с ПК. Поэтому, когда пользователь начинает новый сеанс с программным обеспечением, он сначала проверяет, есть ли на камере какие-либо изображения, и, если да, копирует их локально. Для этого мне нужен способ получить указатели на каждый отдельный элемент каталога. До сих пор я не смог найти в документации или в Интернете ничего о том, как это сделать.
Есть ли способ для EDSDK получить список существующих файлов с камеры?
1 ответ
Я написал функцию для этого, просто чтобы научить себя SDK. Как таковой код не используется ни в чем, что находится в производстве, поэтому я даю вам соответствующую функцию:
/// <summary>
/// Gets a list of files on the CF Card. If dest is given, downloads them
/// </summary>
/// <param name="dest">string.empty if you just want a list of file names, otherwise the folder in which you want the files</param>
/// <returns>a list of file names</returns>
public List<string> GetPicturesOnCard(string dest)
{
IntPtr volumeRef = IntPtr.Zero;
IntPtr dirRef = IntPtr.Zero;
IntPtr subDirRef = IntPtr.Zero;
List<string> result = new List<string>();
try
{
openSession();
int nFiles;
if (EDSDK.EdsGetChildAtIndex(camera, 0, out volumeRef) != EDSDK.EDS_ERR_OK)
throw new CannonException("Couldn't access Memory Card");
//first child is DCIM
if (EDSDK.EdsGetChildAtIndex(volumeRef, 0, out dirRef) != EDSDK.EDS_ERR_OK)
throw new CannonException("Memory Card formatting Error");
//first child of DCIM has the actual photos
if(EDSDK.EdsGetChildAtIndex(dirRef, 0, out subDirRef)!= EDSDK.EDS_ERR_OK)
throw new CannonException("Memory Card formatting Error");
EDSDK.EdsGetChildCount(subDirRef, out nFiles);
for (int i = 0; i < nFiles; i++)
{
IntPtr fileRef = IntPtr.Zero;
EDSDK.EdsDirectoryItemInfo fileInfo;
try
{
EDSDK.EdsGetChildAtIndex(subDirRef, i, out fileRef);
EDSDK.EdsGetDirectoryItemInfo(fileRef, out fileInfo);
if (dest != string.Empty)
{
IntPtr fStream = IntPtr.Zero;//it's a cannon sdk file stream, not a managed stream
uint fSize = fileInfo.Size;
try
{
EDSDK.EdsCreateMemoryStream(fSize, out fStream);
if (EDSDK.EdsDownload(fileRef, fSize, fStream) != EDSDK.EDS_ERR_OK)
throw new CannonException("Image Download failed");
if (EDSDK.EdsDownloadComplete(fileRef) != EDSDK.EDS_ERR_OK)
throw new CannonException("Image Download failed to complete");
byte[] buffer = new byte[fSize];
IntPtr imgLocation;
if (EDSDK.EdsGetPointer(fStream, out imgLocation) == EDSDK.EDS_ERR_OK)
{
Marshal.Copy(imgLocation, buffer, 0, (int)fSize - 1);
File.WriteAllBytes(dest + fileInfo.szFileName, buffer);
}
else
throw new CannonException("Interal Error #1");//because the expection text coud land up in a message box some where
}
finally
{
EDSDK.EdsRelease(fStream);
}
}
}
finally
{
EDSDK.EdsRelease(fileRef);
}
result.Add(fileInfo.szFileName);
}
}
finally
{
EDSDK.EdsRelease(subDirRef);
EDSDK.EdsRelease(dirRef);
EDSDK.EdsRelease(volumeRef);
closeSession();
}
return result;
}
На самом деле вы делаете следующее: инициализируйте SDK, затем камеру, затем откройте сеанс. После этого вы получите ссылку на карточку, затем папку (папка, которую вы хотите, это первый дочерний элемент первого дочернего элемента), а затем переберите все дочерние элементы - это файлы.
Документацию по SDK читать не интересно, но она расскажет вам о пропущенных мною кусочках (как инициализировать камеру и т. Д., Я полагаю, вы знаете, как это сделать из остальной части проекта).