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.
-
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 consoledocument.getElementById("<ID>").files
-
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 consoledocument.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.