在“打开文件”对话框中获取所选文件

时间:2018-04-18 22:01:13

标签: c# winforms openfiledialog

我需要在OpenFileDialog中获取所选文件。对于单个文件,我这样做:

编辑:

var count = SelectedItems(handle); // handle is the handle to ListView control in OpenFiledialog
var bufferSize = 2048 * count;
if (bufferSize > 0)
{
    var path = new StringBuilder(bufferSize)
    SendMessage(handle, CDM_GETFILEPATH, (IntPtr)path.Capacity, path);
}

它工作正常,但我需要检查多个文件(Multiselect = true)。我不知道缓冲区大小(stringBuilder大小)。

编辑:我正在自定义“打开文件”对话框。我想在OFD窗口关闭之前获取所选文件。

编辑:目前我可以有一个选定文件的列表,但是,只有文件名,没有路径,我正在使用它:

var totalItemsCount = SendMessage(handle, LVM_GETITEMCOUNT, 0, 0);
var fileNames = new List<string>();
var lvi = new LVITEM();
var lviPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(LVITEM)));

for (var i = 0; i < totalItemsCount; i++)
{
    var pcsText = Marshal.AllocHGlobal(1024);

    lvi.iSubItem = 0;
    lvi.cchTextMax = 1024;
    lvi.pszText = pcsText;

    Marshal.StructureToPtr(lvi, lviPtr, fDeleteOld: true);

    var success = SendMessage(handle, LVM_GETITEMTEXT, i, (int)lviPtr);
    if (success > 0)
    {
        var itemState = SendMessage(handle, LVM_GETITEMSTATE, i, 2);
        var selected = (itemState & 2) != 0;
        if (selected = (itemState & 2) != 0)
        {
            lvi = (LVITEM)Marshal.PtrToStructure(lviPtr, typeof(LVITEM));
            var name = Marshal.PtrToStringAnsi(lvi.pszText);
            fileNames.Add(name);
        }
     }

     Marshal.FreeHGlobal(pcsText);
 }

 Marshal.FreeHGlobal(lviPtr);

我正在做的是直接从列表视图中获取所选文件,但我需要带路径的gthe文件名。

当OpenfileDialog更改文件夹时,我可以使用以下命令获取文件夹路径:

var folderPath = new StringBuilder(256);
SendMessage(handle, CDM_GETFOLDERPATH, (IntPtr)256, folderPath);

但是当文件夹是特殊文件夹(例如库)时它不起作用。

2 个答案:

答案 0 :(得分:0)

简单:

class FeedPost < ApplicationRecord

  has_many :flights
  has_many :destinations, through: :flights, source: :destination
  has_many :origins, through: :flights, source: :origin

  def locations
    (origins + destinations).uniq
  end

注意:不知道这是否也适用于自定义控件以及没有提供有关自定义控件的代码

答案 1 :(得分:-3)

StringBuilder缓冲区将自动扩展