图片缩略图

GetFullPath

版本1.10.0.0(18.9KB)由 1月
部分或相对路径的完整路径名
4.8
23日评级

20下载

更新2021年5月3日

视图版本历史

查看许可证

编者按:这个文件被选为MATLAB中心本周精选

GetFullPath -获取文件或文件夹名称的绝对路径
此函数将部分或相对路径名转换为绝对完整路径名。快速的Mex只能在Windows上运行,但M-file可以在Windows、MacOS和Unix上运行。
FullName = GetFullPath(Name, Style)
输入:
名称:具有相对或绝对路径的字符、字符串或单元格字符串、文件或文件夹名称。
UNC路径。路径不需要存在。
样式:Windows下长文件名的特殊样式:
“汽车”:添加“/ / ?/'用于长名称(> 255个字符)。
“精益”:否“/?/”。
“脂肪”:/ / ?/'也用于简短的名字。
可选的,默认值:“汽车”。

输出:
FullName:字符或单元格字符串,带有绝对路径的文件或文件夹名称。

例子:
cd (tempdir);假设C:\Temp
GetFullPath('File. ext ') % ==> 'C: Temp\File. txt ';Ext的
GetFullPath('..\File. ext ') % ==> 'Ext的
GetFullPath('.\File. ext ') % ==> 'C:\Temp\File. txt ')Ext的
GetFullPath('*.txt')%=>C:\Temp\*.txt'
GetFullPath('D:\Folder1\..\Folder2')%%=>'D:\Folder2'
GetFullPath('\') % ==> 'C:\',当前驱动器!
GetFullPath('文件夹\')% ==> 'C: Temp\文件夹\'
GetFullPath('\\Server\Folder\Sub\..\File.ext')
% = = > ' \ \ Server \文件夹\ File.ext '

选择:
只对现有文件,慢24倍。
System.IO.FileInfo:.NET(感谢Urs),更多功能,速度大约慢50倍。
java.io.File:“/…”和“/.”由getCanonicalPath修复(大约慢6倍),
但没有完成局部/相对路径。

测试:Matlab 2009a, 2011b, 2018b, WinXP/32, Win7/64, Win10/64
安装:看的需要

欢迎通过电子邮件或评论部分提出建议和问题。

引用作为

1月(2021年)。GetFullPath(//www.tatmou.com/matlabcentral/fileexchange/28249-getfullpath), MATLAB中央文件交换。检索.

意见及评分(52)

杨大卫

感谢您的字符串接受-这简化了一些代码。
我认为InstallMex中有一个错误。217行:

idx = strfind(src, Key);

这里的“Key”应该是“Key”。

1月

我已经更新了C-Mex的代码以接受字符串。

杨大卫

我认为注释仍然需要更新,以明确字符向量而不是字符串需要作为参数。

杨大卫

Jan-对下面的评论表示歉意-我看到您在早些时候的回复中提到了这一点。我认为你还没有更新评论。我想更大的问题是应该有一些mex对字符串类型的支持。金宝app

以利亚Uche

嗨,简,
年,请
道歉
谢谢
以利亚

1月

嗨,Elijah Uche,我认为这个评论是错误的,因为我的提交不涉及STL文件或surface模型,而只是文件名。

以利亚Uche

你好,
请我需要帮助如何转换我的粗糙表面模型生成的MATLAB到一个.stl文件,这将使它与CST兼容。
我尝试过使用这段代码,但似乎没有实现正确的转换。
请帮我个忙。
谢谢

李向瑞

嗨,简,
如果你想让它与Octave兼容,你可以懒惰地使用ispc而不是使用计算机。
-香瑞

马克斯·墨菲

1月

谢谢,HHang李。这个问题现在解决了。

HHang李

这是一个伟大的功能。
一个小问题。.m版本的第156行应该是什么
File = ['\', File(8:length(File))]; / /文件长度而不是
文件= ['\',File(7:length(File))];?

马西莫·夏奇

真管用!伟大的工作!

1月

@Edvard:我无法重现这个问题。请把自检的完整结果邮寄给我。您可以在源代码中找到地址。谢谢。

爱德华Skevington

当运行uTest_GetFullPath (m-file version)时,我收到以下错误:
使用uTest_GetFullPath出错(第387行)
uTest_GetFullPath: fat的意外前缀
风格? !(\ \ ?C \ C: \ \ Server \]分享

1月

@Wis:这是Windows的限制。不允许使用NUL、CON、PRN、AUX、COM1-9、LPT1-9以及后面的点和空格。这不是GetFullPath的一个特性,也不是从“C:\NUL”到“\\”的转换。\NUL"是由Windows的库函数完成的,两者都不能用作文件名。

威斯康星州

在windows7 Pro 64中,“NUL”文件(如*nix“/dev/null)翻译为“\\”。这是一个无效的Windows文件名。MATLAB返回“无法打开文件写:\\.\NUL”

R2018b:

>>GetFullPath('C:/cat')

ans =

“C: \猫”

> > GetFullPath(“C: /空”)

ans =

“\ \ \ NUL '。

1月

@威斯康星州:这是一个正确的观察。在与Matlab 6.5至2018b兼容的C-mex函数中访问现代字符串类型的内容并非易事。帮助部分是很久以前编写的,当时“string”类型不存在。在这些时候,通常把CHAR类型的向量称为“字符串”。
我将修复帮助文本以澄清,只有字符向量和“单元格字符串”(这意味着:包含字符向量的单元格)被接受为输入。
我尝试为现代String类型创建一个变通方法,它将输入透明地转换为CHAR向量,并将结果再次转换为字符串。

威斯康星州

“GetFullPath。mexw64”http://www.n-simon.de/mex

它似乎不支持"string"数据类型,返回消金宝app息:

错误使用GetFullPath
*** GetFullPath: [FileName]必须是字符串或单元格字符串。

测试R2018b

莫妮卡·贾斯卡

StefanoMas

1月

@Max:我的第一个回复神奇地消失了。再次:

感谢您报告这个问题。它是由Matlab的FULLFILE的一个bug引起的,这个bug会回复'C:\\' for FULLFILE('C:'\', '\') since R2015b。看到<//www.tatmou.com/matlabcentral/fileexchange/55474-joinpath-arg1--arg2--varargin->。我将破解单元测试函数并插入一个变通方案。

要运行单元测试,Matlab必须能够找到文件。您可以将M和MEX文件保存在自己的文件夹中,并使用addpath()将其附加到Matlab的PATH中。由于文件夹访问测试需要更改当前文件夹,因此不能依赖当前文件夹。由于这个原因,如果不将父文件夹包含到路径中,就无法进行详尽的测试。我不明白,这有什么让人恼火的。

当文件上传到FEX时,Mathworks会自动插入license文件。我对该文件的名称、内容或位置没有影响。我发现了问题所在,如果你在同一个文件夹中安装了多个提交文件,那么license .txt文件就会被覆盖,这既没用也不合法。那么每次提交都使用自己的文件夹怎么样?如果你决定不这样做,现在是你关注细节的时候了。

1月

PS,我把所有的单元测试函数放在一个单独的文件夹里,从那里我自动开始。对于FEX上传,我将它们复制到同一个文件夹中。在这两种设置中,检查M或Mex版本是否被Matlab找到是一个安全的测试。作为回退,单元测试也可以在当前文件夹中启动,并使用OnCleanup方法恢复它,即使在意外崩溃的情况下。

马克斯Mustermann

在Windows 8.1 64位上使用Matlab R2016b对m和mex文件进行单元测试失败:

路径:[C: \ \用户名\ AppData \漫游用户\ MathWorks \ MATLAB \ R2016b \..\..\..\..\..\..\..) = = >错误
GetFullPath回答说:[C: \]
预期:[C: \ \]
使用uTest_GetFullPath时出错(第336行)
使用uTest_GetFullPath出错(第330行)
uTest_GetFullPath: GetFullPath with folder failed

此外,当单元测试期望m-或mex-文件在Matlab路径上时,这是相当恼人的。在单元测试成功完成之前,我不想在我的搜索路径中安装这个文件。此外,在搜索路径中有一个license.txt和Readme.txt对我来说也很奇怪,因为很多程序都存储在搜索路径中。

林恩

珀斯langevoort

埃文

杰梁

非常有用的功能!这正是我想要的。

伊戈尔

@Charles:关于用“c”代替“m”,你试过其他提供类似功能的提交吗?你测试过他们的表现吗?据我所知,当我寻找这样一个函数前一段时间,我注意到许多“m”的实现相当缓慢。它们中的大多数也很不稳定。我很高兴找到了这个——又快又可靠。对Matlab来说可能是最好的。它仍然不完美,例如,看我下面的评论。我投“5”是因为它比其他人更好,而不是因为它是“完美的”。
我非常同意程序员在使用如此高级的语言时考虑这些事情是荒谬的。

1月

@Charles:微软很久以前就决定不支持超过260个字符的路径名。金宝app其后果是残酷的,例如,具有完整路径名的文件不能被扔到Windows资源管理器的回收站中,也不可能将其拖拽到网络驱动器中。许多其他API函数都受到这个限制的影响。c扩展允许使用操作系统的至少一种可靠方法,这种方法甚至可以正确处理Unicode字符集。但是请注意,即使是Windows的原生GetFullPathName API函数也没有插入必需的\\?自动按需。因此,我无法找到任何代码块,可以从我的函数中删除,而不删除必要的功能。

在FEX中,提供一个额外的M文件来支持Unix和独立于平台的程序是一金宝app个公平的想法。我从来没有见过一个软件,它被测试得太彻底了。

问题不在于在这个函数中花费了多少时间,而在于需要多少调试时间来识别和修复由不寻常的路径名引起的错误(这些路径名没有得到正确处理)。

计算代码行数(包括注释行和测试代码)是评估代码质量的一种奇怪方法。如果您认为,您可以编写一些代码,以更少的行来提供相同的功能,那么我们也邀请您这样做并在这里发布它。你可以在这里找到更多关于这个主题的提交,但他们考虑的例外较少。因此,我仍然相信,这是高质量的代码。当然,如果这样的函数已经包含在Matlab中,我将很高兴。

我感谢任何建设性的反馈,但是“这比我想象的要复杂”并不是一个有帮助的批评,因为这主要取决于您的期望而不是代码。

查尔斯

我反对是因为代码质量问题。在所有m和c文件(包括测试)中有不少于831行代码。831行。用于返回文件的绝对路径的函数。真的。这真的被认为是高质量的MATLAB代码吗?这需要一个C扩展吗?你的MATLAB代码花了多少时间来计算绝对路径?足够值得编写一个C扩展吗?我真不敢相信。

1月

@Charles:我看不出降级的理由,因为它还没有内置功能,这不是我的错。

查尔斯

非常令人担忧的是,这一数量的MATLAB代码和C扩展需要获得文件的绝对路径,这成为了本周的选择。已有30年历史的语言仍然没有获得文件绝对路径的本机函数。

Vinay Kumar Tadepalli

伊戈尔

如果有人想要降低GetFullPath生成UNC路径的长度限制,这个小小的修改似乎有效:

在第86行下面:
-------------------
# include < wchar.h >
-------------------

添加以下两行:
-------------------
# undef MAX_PATH
#定义MAX_PATH 230
-------------------

(为了方便测试,可以首先将MAX_PATH限制为20;并检查GetFullPath是否返回
--------------------------------------
> > GetFullPath (c: \ 123456789123456789)
ans =
\ \ ?\ c: \ 123456789123456789
--------------------------------------
).

1月

@Igor:谢谢你的评论。即使是257或256,仍然存在一些问题,例如MKDIR需要少于248个字符的路径(为什么?):
str=['C:\Temp\',repmat('abcdefghkl\',1,23)]
mkdir(p(1:248)) %错误:文件名或扩展名太长
无法在Windows资源管理器中创建长路径或将其删除到回收器中。
因此,我仍然认为,这些是DIR和MKDIR的局限性,在GetFullPath中包含变通方法不是一个好主意。增强的DIR和MKDIR命令将更加高效和直接。
但更进一步说:实际上这是Windows的问题,它仍然遭受着这种荒谬的限制,这些限制只有在ntfs时代之前才可以理解。

欢迎您将代码中的限制更改为257,我相信仍然会有问题和不一致的所有其他限制。因此,我更喜欢改进的文件处理函数,而不是调整GetFullPath。

伊戈尔

谢谢你的更新!
尽管,一些Matlab函数(如“dir”)在我的R2012b上的258长路径仍然失败。

例子:
只需创建一个如下所示的目录:

p = " C: \ temp \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ abcdefghkl \ ufolder4 '

然后:

> > isdir (p)
ans =
1.
> >存在(p)
ans =
7.
> >长度(p)
ans =
258
> > dir (p)
'C:\temp\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl未找到'4'。
> > isequal (GetFullPath (p), p)
ans =
1.
> > dir (GetFullPath (p)
dir (GetFullPath (p)
|
错误:表达式或语句不正确——可能不平衡(,{,或[。

> > dir (GetFullPath (p))
'C:\temp\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl\abcdefghkl未找到'4'。
>>目录(['\?\'p])

. ..

====================
所以,也许值得将限制更改为,比如说,257个字符?

朱利安

谢谢,很有用;我也需要这样做,但在各种方面都遇到了麻烦,所以从来没有对我的解决方案完全满意。我不完全理解C-windows API方法,但看起来它在我的PC上工作……对于路径的准备,我可以使用cd(cd('/the/path/string'))…

1月

谢谢伊戈尔!如果完整路径有254个字符,则还有另一个问题。虽然Windows接受这一点,但Matlab的DIR命令不接受。我很快就会发布一个改进的版本。

伊戈尔

看起来我发现了另一个错误-如果一个尝试使用255+长的UNS路径作为GetFullPath参数,(例如:嵌套的GetFullPath)这可能会导致前缀重复,即无效的文件名。

---------------------------------------
I:\ROSPAN International\Suzunskoye field\Well 969\ x射线micro-CT\1。Suzun 82180-82181\Tfit\ incomplete\smp_w_fdiff 2012-04-13 20.43.59\\fit_Tall_IR\/fit_Tall_IR_2(内题方)//unaligned//Histograms0001/errorbar_runmean_mask (vol1-vol2)_vs_mean(vol1(mask))')
ans =
\ \ ?\I:\ROSPAN International\Suzunskoye field\Well 969\ x射线微ct \1。Suzun 82180-82181\Tfit\incomplete\smp_w_fdiff 2012-04-13 20.43.59\fit_Tall_IR\fit_Tall_IR_2(内题方)\unaligned\Histograms0001\errorbar_runmean_mask (vol1-vol2)_vs_mean(vol1(mask))
K> >GetFullPath(GetFullPath('I:\ROSPAN International\Suzunskoye field\Well 969\X射线显微CT\1.Suzun 82180-82181\Tfit\\complete\smp\u w\u fdiff 2012-04-13 20.43.59\\fit\u-Tall\u-IR\/fit\u-Tall\u-IR\u-IR\u 2(内接正方形)//未对齐//历史图0001/errorbar\u-runmean\u-mask(vol1-vol2)\u-vs-mean(vol1(mask)))
ans =
\ \ \ UNC \ ?\I:\ROSPAN International\Suzunskoye field\Well 969\ x射线微ct \1。Suzun 82180-82181\Tfit\incomplete\smp_w_fdiff 2012-04-13 20.43.59\fit_Tall_IR\fit_Tall_IR_2(内题方)\unaligned\Histograms0001\errorbar_runmean_mask (vol1-vol2)_vs_mean(vol1(mask))
K > >

奥斯卡

Kiran

保罗教堂司事

我遇到了和Daniel一样的问题(2011年5月1日版本)。使用03Nov2011版本修复了这个行为。

在Linux(32位)上运行测试仍然会失败:

> > uTest_GetFullPath
==== Test GetFullPath 09-Dec-2011 14:21:31
功能:/home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 / GetFullPath.m
当前路径:/home/psexton/Documents/MATLAB/GetFullPath_03Nov2011

ok: /home/psexton/ documents / matlab / getfullpath_03nov2011, Folder: [Folder/]
ok: /home/psexton/Documents/MATLAB/GetFullPath_03Nov2011, File: File
ok: / . . /文件夹
ok: / . . / . . /文件夹
好吧 : ../../../ 文件夹/
好吧 : ../../../../ 文件夹/
确定:../../../../../Folder/
确定:../File
ok: . . / . . /文件
好吧 : ../../../ 文件
确定:../../../../File
好吧 : ../../../../../ 文件
好:/home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 / . . /文件夹/
好:/home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 / . . / . . /文件夹/
ok: /home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 /../../../ 文件夹/
ok: /home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 /../../../../ 文件夹/
ok: /home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 /../../../../../ 文件夹/
好:/home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 / . . /文件
好:/home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 / . . / . . /文件
确定:/home/psexon/Documents/MATLAB/GetFullPath\u 03Nov2011/。/../../../File
ok: /home/psexton/Documents/MATLAB/GetFullPath_03Nov2011 /../../../../ 文件
确定:/home/psexon/Documents/MATLAB/GetFullPath\u 03Nov2011/../../../../../File
路径:[/home/psexon/Documents/MATLAB/GetFullPath\u 03Nov2011/。]==>错误
GetFullPath回复:[/home/psexton/Documents/MATLAB]
预期:[回家/ psexton /文件/ MATLAB)
使用uTest_GetFullPath时出错(第202行)
使用uTest_GetFullPath出错(第196行)
uTest_GetFullPath: GetFullPath with folder failed

1月

@丹尼尔:我试图改进代码,但无法在Linux下测试。

丹尼尔Shub

我不确定这是否适用于Linux…
GetFullPath(“/ home /测试/ . . /”)
给/喂/家/

伊戈尔

Eugeny Sosnovsky

奥利弗·伍德福德

是的,非mex版本(我最初没有看到)非常好。

1月

@Oliver:或者使用已经发布的m版本,它运行在Win/MacOS/Linux上,考虑“C:”、“..”、“。”和“~/”,并且不改变当前路径。
如果注释掉关于未找到MEX的警告,则对于没有路径的文件,GetFullPath.m比FULLPATH快2.5倍,对于具有真实路径或完整路径的文件,GetFullPath.m比FULLPATH快40倍(WinXP,2009a)。

奥利弗·伍德福德

对于那些想要跨平台工作的功能、不需要混合以及不太在乎速度的人,另一种选择是:
//www.tatmou.com/matlabcentral/fileexchange/23603-fullpath

1月

谢谢一致!医生修好了。

我们

1月

这应该得到纠正
- System.IO.FileInfo是一个。net组件(仅在最近的ML版本中可用)
- java.io. file是java类

用户需求说明书

托马斯Schreiter

正是我需要的。
我将这个GetFullPath包含到我的设置文件中,这些文件准备了Matlab路径。现在这些路径不再包含“\..”了。效果:Matlab对一个文件只使用一个路径,而不是多个路径,这让调试器感到困惑。

MATLAB版本兼容性
创建R2018b
与任何版本兼容
平台兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始狩猎!