我将从非常简单的代码开始
string fileName; // filename of file
// get the filename
using (OpenFileDialog openFileDialog = new OpenFileDialog()) {
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog.FilterIndex = 1;
openFileDialog.ShowDialog();
fileName = openFileDialog.FileName;
}
Run Code Online (Sandbox Code Playgroud)
我想做的是使用.Net OpenFileDialog.并将其设置InitialDirectory为运行应用程序的“我的文档”文件夹的用户。
代码将初始目录的路径设置为:C:\Users\Aaron\Documents,即测试用户的我的文档目录。
当我运行代码时,OpenFileDialog实际上是在目录中打开的:C:\Users\Aaron\OneDrive\Documents。这是 One Drive 位置。
我的两台机器上都发生这种情况,但我朋友的机器上却没有。
当路径未设置为 时,为什么 OneDrive 文档文件夹会打开OpenFIleDialog.InitialDirectory?
编辑:我可能应该更新这个。第二天,我再次运行我的项目,问题不再发生。我也没有更改我的代码。这一定是一个侥幸的情况。
我正在尝试使用 CommonOpenFileDialog 的文件夹选择器,如本答案中所述。问题是,即使有一个非常精简的示例项目,我在尝试使用 CommonOpenFileDialog 的函数时也会遇到异常ShowDialog()。
using Microsoft.WindowsAPICodePack.Dialogs;
namespace DialogTest
{
class Program
{
public static void Main(string[] args)
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
CommonFileDialogResult result = dialog.ShowDialog();
if (result == CommonFileDialogResult.Ok)
{
//Do Stuff
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还与作者 Microsoft 一起使用以下 nuget 包:
此代码在 处产生以下异常dialog.ShowDialog();:
System.Runtime.InteropServices.COMException was unhandled
ErrorCode=-2147023116
HResult=-2147023116
Message=A null reference pointer was passed to the stub. (Exception from HRESULT: …Run Code Online (Sandbox Code Playgroud) 如何获取Access 2010 64bit的"打开文件"对话框?通常我会使用通用对话框控件,但它是32位,不能与Access 2010 64位一起使用.
我有以下代码,我用来使用Win32 API打开文件打开对话框.它在32位工作正常,但在64位(在DLL中)使用时失败.我究竟做错了什么?
char Filestring[256];
Filter = "OBJ files\0*.obj\0\0";
char* returnstring = NULL;
OPENFILENAME opf;
opf.hwndOwner = mainHWND;
opf.lpstrFilter = Filter;
opf.lpstrCustomFilter = 0;
opf.nMaxCustFilter = 0L;
opf.nFilterIndex = 1L;
opf.lpstrFile = Filestring;
opf.lpstrFile[0] = '\0';
opf.nMaxFile = 256;
opf.lpstrFileTitle = 0;
opf.nMaxFileTitle=50;
opf.lpstrInitialDir = Path;
opf.lpstrTitle = "Open Obj File";
opf.nFileOffset = 0;
opf.nFileExtension = 0;
opf.lpstrDefExt = "*.*";
opf.lpfnHook = NULL;
opf.lCustData = 0;
opf.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT) & ~OFN_ALLOWMULTISELECT;
opf.lStructSize = sizeof(OPENFILENAME);
if(GetOpenFileName(&opf))
{
returnstring = opf.lpstrFile; …Run Code Online (Sandbox Code Playgroud) Winform OpenFileDialog,每次打开它,内存都会增加,dispose()和OpenFileDialog = null不起作用,内存不会丢失..
怎么解决这个?
private void btnLocalPicture_Click(object sender, EventArgs e)
{
OpenFileDialog ofdSelectPicture = new OpenFileDialog();
ofdSelectPicture.Filter = "PicFile|*.jpg;*.png;*.jpeg;*.gif;*.bmp;*.tif";
if (ofdSelectPicture.ShowDialog() == DialogResult.OK)
{
if (showPicture != null)
showPicture.Dispose();
showPicture = Image.FromFile(ofdSelectPicture.FileName);
if (pbShowPicture.Image != null)
pbShowPicture.Image.Dispose();
pbShowPicture.Image = showPicture;
path = ofdSelectPicture.FileName;
WordTip.Visible = false;
if (pbShowPicture.Image != null)
picOK.Enabled = true;
}
ofdSelectPicture.Dispose(); //not working
ofdSelectPicture = null; //not working
GC.Collect();
}
Run Code Online (Sandbox Code Playgroud) 我有打开OpenFileDialog的代码,我正在检查文件的大小以确保它不超过特定限制.但是,如果用户选择了一个大尺寸文件,我需要警告他并引导他返回对话框以选择其他文件或单击取消.
这就是我尝试过的:
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Jpeg files, PDF files, Word files|*.jpg;*.pdf;*.doc;*.docx";
while (dialog.ShowDialog() != DialogResult.Cancel)
{
var size = new FileInfo(dialog.FileName).Length;
if (size > 250000)
{
MessageBox.Show("File size exceeded");
continue;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我也尝试了以下代码,但每次调用ShowDialog时它都会打开对话框.因此,如果用户选择的文件大小为限制的3倍,则对话框将出现3次.
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Jpeg files, PDF files, Word files|*.jpg;*.pdf;*.doc;*.docx";
dialog.FileOk += delegate(object s, CancelEventArgs ev)
{
var size = new FileInfo(dialog.FileName).Length;
if (size > 250000)
{
XtraMessageBox.Show("File size");
dialog.ShowDialog();
}
};
if (dialog.ShowDialog() == DialogResult.OK)
{
XtraMessageBox.Show("File Selected");
}
Run Code Online (Sandbox Code Playgroud) 我的WPF应用程序正在使用Microsoft.Win32.OpenFileDialog来选择要打开的SQL Server 2008数据库.
它工作正常,但有一个问题:当对话框中选择的数据库以前在上次启动后的某个时间打开时,该文件似乎在后台由SQL服务器保持打开(即使我的应用程序没有打开它和我的应用程序已重新启动).当在OpenFileDialog中单击"确定"时,这会导致"另一个应用程序使用的文件"警告,并且在重新启动计算机之前,我无法使用该对话框打开该特定数据库.似乎OpenFileDialog尝试打开所选文件并执行该操作,发现它已被另一个应用程序(SQL Server)打开.如何禁用OpenFileDialog尝试打开所选文件,只返回所选文件的文件名而不进行任何检查?
我的代码看起来像这样:
public void OpenDatabase() {
// Let user select database to open from file browser dialog
// Configure open file dialog box
var dlg = new Microsoft.Win32.OpenFileDialog();
dlg.FileName = ""; // Default file name
dlg.DefaultExt = ".mdf"; // Default file extension
dlg.Filter = "Databases (.mdf)|*.mdf|All Files|*.*"; // Filter files by extension
dlg.CheckFileExists = false;
dlg.CheckPathExists = false;
// Show open file dialog box
bool? result = dlg.ShowDialog(); // Gives file in use warning second time! …Run Code Online (Sandbox Code Playgroud) 我注意到OpenFileDialog未能显示目录中的所有文件,这发生在我的应用程序中,但也发生在其他 Windows本机程序,如任务管理器"新任务""浏览"选项(使用OpenFileDialog控件),是否有人知道原因和可能的解决方法为了那个原因?
即使以管理员身份运行任务管理器也没有修复它,因此它不是由特权引起的
编辑:我现在知道这是由一个名为文件系统重定向器的appcompat功能引起的,显然我正在启动任务管理器32位,以及我自己的应用程序,因此它向我展示了32位system32又名SysWOW64文件夹(在Windows上谈论奇怪的命名方案) 7 64bit System32有64位文件,SysWOW64有32位文件),当你运行某个应用程序的32位版本时,你无法通过OpenFileDialog任何方式访问64位System32文件夹.
例如,在这里看到,它缺少SnippingTool.exe(但它不仅限于)
虽然我确信它确实存在于目标位置

文件对话框必须打开关闭之前使用的最后一个目录位置,但我不知道如何执行此操作.我的同事只给我看了一个单词的例子,当你单击"文件"它显示最后使用的文件时,他告诉我使用寄存器或INI文件,这是我以前从未使用过的.
这是我正在使用的代码:
string f_sOudeLocatie = @"D:\path\is\classified";
private void btBrowse_Click(object sender, EventArgs e)
{
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.Title = "Zoek de CSV file";
fdlg.InitialDirectory = f_sOudeLocatie;
fdlg.Filter = "All files (*.*)|*.*|All files (*.*)|*.*";
fdlg.FilterIndex = 1;
fdlg.RestoreDirectory = true;
if (fdlg.ShowDialog() == DialogResult.OK)
{
tbGekozenBestand.Text = fdlg.FileName;
tbVeranderNaamIn.Text = Path.GetDirectoryName(fdlg.FileName);
f_sOudeLocatie = Path.GetDirectoryName(fdlg.FileName);
f_sSourceFileName = fdlg.FileName;
f_sDestFileName = Path.GetFileName(Path.GetDirectoryName(fdlg.FileName)) + ".csv";
btOpslaan.Enabled = true;
tbVeranderNaamIn.ReadOnly = false;
}
}
Run Code Online (Sandbox Code Playgroud) dialog是一个OpenFileDialog类对象,我正在使用ShowDialog()方法.
当我使用包含相对路径的路径时,例如:
dialog.InitialDirectory = "..\\abcd";
dialog.InitialDirectory = Directory.GetCurrentDirectory() + "..\\abcd";
Run Code Online (Sandbox Code Playgroud)
ShowDialog() 崩溃,我只能做一个明确的路径,从磁盘驱动器开始:
dialog.InitialDirectory = "C:\\ABC\\DEF\\abcd";
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我希望路径是我的.exe的当前目录的1级,然后向下到目录abcd)
.exe的当前路径可以找到Directory.GetCurrentDirectory(),这是完全正常的,但我不能继续"..")
目录层次结构如下:
ABC
DEF
abcd (where i want)
defg (where .exe is at)
Run Code Online (Sandbox Code Playgroud)
那么,有没有任何使用方法"..\\"有InitialDirectory?
或者我必须使用明确的路径?
谢谢!