Python程序中的所有路径都可以使用".."(对于父目录)和/(用于分隔路径组件),并且仍然可以在平台上运行吗?
一方面,我从未在文档中看到过这样的说法(我可能已经错过了它),os和os.path模块确实提供了以平台无关的方式处理路径的工具(os.pardir,os.path.加入,...),这让我觉得他们在这里是有原因的.
另一方面,您可以在StackOverflow上阅读 "../path/to/file"适用于所有平台......
因此,为了便于携带,是否应始终使用os.pardir,os.path.join和朋友,或者Unix路径名是否始终安全(最多可能出现字符编码问题)?或者"几乎总是"安全(即在Windows,OS X和Linux下工作)?
是否有一个Windows API函数,我可以传递一个字符串值,将返回一个值,指示文件名是否有效?
我需要验证文件名是否有效,并且我正在寻找一种简单的方法来实现它,而无需重新发明轮子.我正在直接使用C,但目标是Win32 API.
如果内置没有这样的功能,我将如何编写自己的功能?是否存在Windows用于确定文件名有效性的通用算法或模式?
我刚刚使用这个最有用的链接:如何在Windows下检查给定字符串是否是合法/有效的文件名?
在一些验证代码中我有一些看起来像(忽略我不使用StringBuilder类并忽略形成消息的错误的事实(如果它显示,不需要多次告诉他们'冒号'不止一次在字符串中)):
string InvalidFileNameChars = new string(Path.GetInvalidFileNameChars());
Regex ContainsABadChar = new Regex("[" + Regex.Escape(InvalidFileNameChars) + "]");
MatchCollection BadChars = ContainsABadChar.Matches(txtFileName.Text);
if (BadChars.Count > 0)
{
string Msg = "The following invalid characters were detected:\r\n\r\n";
foreach (Match Bad in BadChars)
{
Msg += Bad.Value + "\r\n";
}
MessageBox.Show(Msg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Run Code Online (Sandbox Code Playgroud)
MessageBox看起来像(使用找到冒号的例子):
- 开始 -
检测到以下无效字符:
:
- 结束 -
我希望它能说:
- 开始 -
检测到以下无效字符:
冒号 - >:
- 结束 -
我喜欢英文名字.不是杀手,但很奇怪是否有一些功能(Char类不存在,但可能存在于我没想到的其他类中):
Char.GetEnglishName( ':');
我是 stackoverflow 的新手。我知道这是一个愚蠢的问题,但我被困在其中。我想验证一个文件名,以便它只接受合法路径。我试过下面的代码:
if (txtFileName.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
MessageBox.Show("The filename is invalid");
return;
}
Run Code Online (Sandbox Code Playgroud)
但是,它起作用了,我对它是否会完全起作用感到有些困惑,所以我也想知道其他答案。我认为我们也可以使用正则表达式验证文件名。任何帮助都会很棒。
我想检查我的字符串是否是有效的Windows文件路径.我在四处寻找,似乎没有可靠的方法来做到这一点.我还检查了boost文件系统库,并且没有明显的功能来执行此检查,可能类似于is_valid_windows_name
对于文件C:\filename.txt,
File.Exists(@"c:\filename.txt/");
Run Code Online (Sandbox Code Playgroud)
回报true.但是当我们尝试使用该文件名打开时,它会失败.
由于尾随/,文件名很糟糕.但是,我们如何测试以确定文件是否有效,因为这告诉我它不仅可以,而且文件存在.
更新:在标准命令行测试应用程序中,结果符合预期(false).但在我的 自定义uri处理程序中,File.Exists()返回true.这真的很奇怪.
在所有平台(包括Android,iOS等移动平台)上检查文件名是否在Python中有效的最保守的方法是什么?
防爆.
this_is_valid_name.jpg - >有效
**adad.jpg - >无效
a/ad - >无效
我想要一个函数,可能在Path Functions中,它可以检查文件名是否有效。有效是指字符串中存在的字符是否全部有效(例如,?没有等)。>但遗憾的是,没有任何功能。浏览网络,我发现很少的技术,没有一个是我喜欢的,也没有找到可靠的。
%TEMP%系统路径中。如果创建失败,则文件名(可能)无效。否则,它是有效的(因此,删除该文件)。?:*>)函数的扩展形式是检查所有无效名称(例如AUX等CON),但这不是问题(至少目前如此)。
是否有任何我可能错过的已记录/未记录的函数,它可以可靠地检查文件名(而不是路径名)是否有效。
我正在使用SetDllDirectory(实际上是SetDllDirectoryW)来从特定目录加载一些延迟加载的库.
它就像
if (SetDllDirectory(directory.c_str()) == 0)
{
ERROR_MSG("Failed to set the current dll directory [%d]\n", GetLastError());
}
Run Code Online (Sandbox Code Playgroud)
所以一切正常,大部分时间"f:/source/trunk 11"都很好,等等.
但是当它被调用时"f:/source/trunk Gest hieß es !?;%()_@#$^&",我ERROR_INVALID_PARAMETER从GetLastError 得到.我能够创建一个具有这样名称的目录,我可以使用它.
但有什么特别的SetDllDirectory和"Gest hieß es !?;%()_@#$^&"?我该如何解决?
显然,Windows(或Windows的至少一部分)会忽略路径中的多个反斜杠,并将其视为单个反斜杠。例如,从命令提示符处或“运行”窗口中执行以下任何命令都会打开记事本:
C:\Windows\System32\Notepad.exe
C:\Windows\System32\\Notepad.exe
C:\Windows\System32\\\Notepad.exe
C:\Windows\System32\\\\Notepad.exe
C:\\Windows\\System32\\Notepad.exe
C:\\\Windows\\\System32\\\Notepad.exe
Run Code Online (Sandbox Code Playgroud)
这甚至可以与在命令行上传递的参数一起使用:
notepad "C:\Users\username\Desktop\\\\myfile.txt"
Run Code Online (Sandbox Code Playgroud)
此行为记录在任何地方吗?我试了搜查,只发现这个 SO疑问,甚至提到的行为。
注意:我不是在问UNC路径(\\服务器名),\\?\前缀或\\“双引号转义符。
注意:在使用批处理文件时,我偶然发现了这种现象。批处理文件中的一行看起来像这样:
"%SOME_PATH%\myapp.exe"
Run Code Online (Sandbox Code Playgroud)
变量展开后,命令如下所示:
"C:\Program Files\Vendor\MyApp\\myapp.exe"
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,该批处理文件按预期执行,并且未因某种“找不到路径”错误而失败。
我有一个string存储文件名并用于SaveFileDialog.在将文件名分配给FileName属性之前,我需要确保文件名有效(例如,不包含斜杠)SaveFileDialog.我的问题是:在分配文件名之前,是否有快速确保文件名有效的方法?
例:
string fileName = fileNameTextBox.Text;
//Some code here to check validity of fileName
if(fileNameIsValid)
{
saveFileDialog.FileName = fileName;
}
Run Code Online (Sandbox Code Playgroud) c# ×4
windows ×4
c++ ×3
path ×3
winapi ×3
.net ×2
c ×2
filenames ×2
python ×2
batch-file ×1
char ×1
character ×1
command-line ×1
file ×1
file-io ×1
filesystems ×1
portability ×1
unicode ×1