IMAPI:如果图像大小超过可用空间,如何获取图像大小而不抛出异常?

Posted

技术标签:

【中文标题】IMAPI:如果图像大小超过可用空间,如何获取图像大小而不抛出异常?【英文标题】:IMAPI: How to get image size without throwing exception if image size exceeds free space? 【发布时间】:2016-09-10 13:55:12 【问题描述】:

我正在编写代码以使用 IMAPI (C#.NET) 编写媒体 (CD/DVD)。 写作一切正常。 如果我尝试添加超出媒体可用空间的文件,则会引发异常。 我可以捕捉到异常,但它不符合我的目的。 我想去添加文件,即使它超过了可用空间。 然后,我想将图像的总大小返回给用户,然后他们将根据要求执行必要的操作(更新 UI、显示消息、在 UI 上显示图像的大小等)。 换句话说,我想获得总图像大小,即使它超过了可用空间。 我可以看到很多媒体刻录应用程序都在这样做;所以这一定是可能的。

下面一行代码抛出异常:-

fileSystemImage.Root.AddFile(thisFileItem.DestPath + thisFileItem.DisplayName, stream);

以下是异常详情:-

ComException

错误代码:-1062555360

消息:添加“myfilename”将导致结果图像的大小大于当前配置的限制。

以下是我的代码:-

MsftDiscFormat2Data discFormatData = null;
MsftDiscRecorder2 discRecorder = null;
MsftFileSystemImage fileSystemImage = null;

discRecorder = new MsftDiscRecorder2();
discRecorder.InitializeDiscRecorder(UniqueRecorderId);

discFormatData = new MsftDiscFormat2Data

    Recorder = discRecorder,
    ClientName = CLIENT_NAME,
    ForceMediaToBeClosed = _closeSession
;

fileSystemImage = new MsftFileSystemImage();
fileSystemImage.VolumeName = _volumeID;
fileSystemImage.Update += fileSystemImage_Update;
fileSystemImage.ChooseImageDefaults(discRecorder);

fileSystemImage.FileSystemsToCreate = FsiFileSystems.FsiFileSystemJoliet | FsiFileSystems.FsiFileSystemISO9660 | FsiFileSystems.FsiFileSystemUDF;

if(!discFormatData.MediaHeuristicallyBlank)

    fileSystemImage.MultisessionInterfaces = discFormatData.MultisessionInterfaces;
    fileSystemImage.ImportFileSystem();


foreach(FileItem thisFileItem in listFileItem)

    IStream stream = null;
    if(thisFileItem.SourcePath != null)
        Win32.SHCreateStreamOnFile(thisFileItem.SourcePath, Win32.STGM_READ | Win32.STGM_SHARE_DENY_WRITE, ref stream);
    fileSystemImage.Root.AddFile(thisFileItem.DestPath + thisFileItem.DisplayName, stream);


IFileSystemImageResult objIFileSystemImageResult;
objIFileSystemImageResult = fileSystemImage.CreateResultImage();
_imageSize = (objIFileSystemImageResult.TotalBlocks * objIFileSystemImageResult.BlockSize);
IStream imageStream = objIFileSystemImageResult.ImageStream;
fileSystemImage.Update -= fileSystemImage_Update;

【问题讨论】:

即 IMAPI_E_IMAGE_SIZE_LIMIT。这仅意味着一件事,您达到了大小限制。它怎么可能没有目的呢?没有 TryAdd() 方法,只能凑合了。 @HansPassant:同意;但是有许多媒体刻录应用程序会显示总图像大小,即使大小超过可用空间也是如此。无论可用空间如何,我都想返回总图像大小。 【参考方案1】:

不是解决方案,但我得到了破解。

fileSystemImage.FreeMediaBlocks = int.MaxValue;

这将允许创建任何大小(最多整数限制)的图像,而与插入的媒体上的空闲块无关。然后,您可以以自己的方式实施验证。

【讨论】:

以上是关于IMAPI:如果图像大小超过可用空间,如何获取图像大小而不抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章

CSS 和图像大小

将图像重新调整为新的高度和宽度,但不要超过原始高度和宽度

缩放图像以适应可用空间,同时防止裁剪

如果视口超过一定宽度,则停止图像元素下载图像

使用 Python - 如何在不超过原始图像大小的情况下调整裁剪图像的大小以满足纵横比

怎么固定div中插入图像大小和比例