Home General

Get mutiple files from Input failed

since LINQPad.Controls.FilePicker can only choose one file, I try to implement by extend LINQPad.Controls.TextBox.

var tbFileSingle = new LINQPad.Controls.TextBox().SetFile().Dump("Single File");

var btnSingle = new LINQPad.Controls.Button("print selected single file").Dump("Single File");
btnSingle.Click += (s, e) => {
  tbFileSingle.Text.Dump("Single File");
};

var tbFileMultiple = new LINQPad.Controls.TextBox().SetFileMutiple().Dump("Multiple File");

var btnMultiple = new LINQPad.Controls.Button("print selected mutiple file").Dump("Multiple File");
btnMultiple.Click += (s, e) => {
  tbFileMultiple.Text.Dump("Multiple File");
};


public static class Ext_TextBox {  
  public static LINQPad.Controls.TextBox SetFile(this LINQPad.Controls.TextBox control) {
    control.HtmlElement.SetAttribute("type", "file");
    return control;
  }

  public static LINQPad.Controls.TextBox SetFileMutiple(this LINQPad.Controls.TextBox control) {
    control.SetFile();
    control.HtmlElement.SetAttribute("multiple", "");
    return control;
  }
}

I can get file path with single file setting, but can't get all file path with mutilple file setting.
Any solution?

Comments

  • Btw, FilePicker could't choose file by drag, while my extend for TextBox allow drag file or files.

  • edited March 6
    var tbFileSingle = new LINQPad.Controls.TextBox().SetFile().Dump("Single File");
    
    var btnSingle = new LINQPad.Controls.Button("print selected single file").Dump("Single File");
    btnSingle.Click += (s, e) => {
      tbFileSingle.Text.Dump("Single File");
    };
    
    var tbFileMultiple = new LINQPad.Controls.TextBox().SetFileMutiple().Dump("Multiple File");
    
    var btnMultiple = new LINQPad.Controls.Button("print selected mutiple file").Dump("Multiple File");
    btnMultiple.Click += (s, e) => {
        // >>> BEGIN: New code.
        var path = Path.GetDirectoryName(tbFileMultiple.Text);
        var len = Convert.ToInt32(tbFileMultiple.HtmlElement.GetAttribute("files.length"));
        for(var i = 0; i < len; i++)
        {
            Path.Join(path, tbFileMultiple.HtmlElement.GetAttribute($"files[{i}].name")).Dump();
        }
        // >>> END: New code.
    };
    
    
    public static class Ext_TextBox {  
      public static LINQPad.Controls.TextBox SetFile(this LINQPad.Controls.TextBox control) {
        control.HtmlElement.SetAttribute("type", "file");
        return control;
      }
    
      public static LINQPad.Controls.TextBox SetFileMutiple(this LINQPad.Controls.TextBox control) {
        control.SetFile();
        control.HtmlElement.SetAttribute("multiple", "");
        return control;
      }
    }
    

    You can inspect specific field content in HTML DevTools (F12 in result pane) by executing in console document.getElementById("<ID>").files

  • edited March 6

    Win32 multiselect file dialog using nuget (save as script file first):

    <Query Kind="Program">
      <NuGetReference>Microsoft-WindowsAPICodePack-Shell-6.0</NuGetReference>
    </Query>
    
    [STAThread] // IMPORTANT!!!
    void Main()
    {
        var b = new LINQPad.Controls.Button("Click!").Dump();
    
        b.Click += delegate
        {
            var openFileDialog = new Microsoft.Win32.OpenFileDialog
            {
                Title = "Select Multiple",
                Multiselect = true,
                ValidateNames = true,
                CheckPathExists = true,
                CheckFileExists = true,
                DefaultExt = ".*",
                Filter = "All files (*.*)|*.*",
                FilterIndex = 0,
                AddExtension = true
            };
    
            // No owner: Dialog is non-modal!!!
            var result = openFileDialog.ShowDialog(null /* owner */) == true;
    
            openFileDialog.FileNames.Dump();
        };
    }
    
  • @i2van said:

    var tbFileSingle = new LINQPad.Controls.TextBox().SetFile().Dump("Single File");
    
    var btnSingle = new LINQPad.Controls.Button("print selected single file").Dump("Single File");
    btnSingle.Click += (s, e) => {
      tbFileSingle.Text.Dump("Single File");
    };
    
    var tbFileMultiple = new LINQPad.Controls.TextBox().SetFileMutiple().Dump("Multiple File");
    
    var btnMultiple = new LINQPad.Controls.Button("print selected mutiple file").Dump("Multiple File");
    btnMultiple.Click += (s, e) => {
      // >>> BEGIN: New code.
      var path = Path.GetDirectoryName(tbFileMultiple.Text);
      var len = Convert.ToInt32(tbFileMultiple.HtmlElement.GetAttribute("files.length"));
      for(var i = 0; i < len; i++)
      {
          Path.Join(path, tbFileMultiple.HtmlElement.GetAttribute($"files[{i}].name")).Dump();
      }
      // >>> END: New code.
    };
    
    
    public static class Ext_TextBox {  
      public static LINQPad.Controls.TextBox SetFile(this LINQPad.Controls.TextBox control) {
        control.HtmlElement.SetAttribute("type", "file");
        return control;
      }
    
      public static LINQPad.Controls.TextBox SetFileMutiple(this LINQPad.Controls.TextBox control) {
        control.SetFile();
        control.HtmlElement.SetAttribute("multiple", "");
        return control;
      }
    }
    

    You can inspect specific field content in HTML DevTools (F12 in result pane) by executing in console document.getElementById("<ID>").files

    Thanks, I add your method to TextBox Extend

    public static List<string> GetFiles(this TextBox control) {
      var path = Path.GetDirectoryName(control.Text);
      var len = Convert.ToInt32(control.HtmlElement.GetAttribute("files.length"));
      var list = new List<string>();
      for (var i = 0; i < len; i++) {
        list.Add(Path.Join(path, control.HtmlElement.GetAttribute($"files[{i}].name")));
      }
      return list;
    }
    
  • I found another problem, below code varaible path alway get "C:\fakepath"

    btnMultiple.Click += (s, e) => {
      // >>> BEGIN: New code.
      var path = Path.GetDirectoryName(tbFileMultiple.Text); //always get "C:\fakepath"
      var len = Convert.ToInt32(tbFileMultiple.HtmlElement.GetAttribute("files.length")); 
      for(var i = 0; i < len; i++)
      {
          Path.Join(path, tbFileMultiple.HtmlElement.GetAttribute($"files[{i}].name")).Dump();
      }
      // >>> END: New code.
    };
    

    and single file TextBox.Text Get "C:\fakepath\xxxx.xx" too.
    the path folder all shows "C:\fakepath" instead of correct path

  • I think it's the browser limitation. Inspect shows no file path at all.

Sign In or Register to comment.