我需要能够将两个不同的Windowspath(这两个path可能是相对的)组合到一个path中(通过将第二个path应用为第一个path的扩展)。 文件系统上是否存在任何path应该没有关系。 例子:
C:abc + def -> C:abcdef C:abc + ..def -> C:def \servershare + def -> \serversharedef ..somepathabc + ..def -> ..somepathdef ..somepath + ......def -> ....def
理想情况下,它还应该解决与驱动相关的“绝对”path(即以单个反斜杠开始的path)到给定驱动器上的相应path:
C:abc + def -> C:def
最后,如果通过返回绝对path处理第二条path的情况是绝对的,那将是很好的:
C:abc + D:def -> D:def
另一种说法是:
尽pipe我有规则反对,但我在一个专栏中有重复的结果。 我怎样才能消除这种重复发生?
IIS Express 10configuration重置
如何永久,永远忽略Subversion上的thumbs.db?
带有自己的button文本的消息框
使用模拟用户在File.Encrypt上获取System.IO.IOException
我想要一个函数作为参数path“A”和path“B”。 输出“C”应该是相同的,如果我先用A调用SetCurrentDirectory ,然后用B调用GetCurrentDirectory (然而,如果path不存在并不重要,并且不应该改变当前的工作目录,如果A和B都是相对path,结果应该是相对path;如果结果path包含“..”段,我不会特别在意)。
该代码需要在Windows 7上工作。我已经查看了Windows API中的shellpath处理函数 ,但它们似乎不太合适:
对于PathAppend ,第一个path不能是相对的:
pszPath中提供的path不能以“.. ”或“。”开头,以产生相对pathstring。 如果存在,则从输出string中去除这些句点。
对于PathCombine ,第一个path不能是相对的,不能是UNCpath:
目录path应该是A :,B:,…,Z:
( 编辑 :仔细检查,文档的片段似乎可能确实属于另一个函数,提到的参数名称与方法签名中给出的参数名称不同,事实上,如下面第二个答案中所示, PathCombine看起来可以和UNCpath一起工作,但是,它有和PathAppend一样的问题 – 它从输出path中PathAppend前导的..段)。
PathCchCombine和PathAllocCombine仅在Windows 8及更高版本上可用。
是否有任何我忽略的标准函数,或者是否有任何库能正确处理包括UNC风格path在内的所有情况? 还是至less有一个简单的方法来实现一个function,使用其他已经可用的符合我的要求?
升级到wamp 3之后,gettext不会改变语言
在TideSDK中安装python模块
TCL Expect ::在Windows XP上运行的脚本没有运行在Windows 7上。有什么想法吗?
为Windows升级Ruby(1.9-> 2)和Rails(3.2-> 4)
#include <stdio.h> #include <stdlib.h> #ifndef MAX_PATH #define MAX_PATH 260 #endif char *rootFolder(char *folder); int IsFullPath(const char *p){ if(p && *p){ if(((*p>='A') && (*p<='Z')) ||((*p>='a') && (*p<='z'))){ return p[1]==':'; } return *p=='\' & p[1]=='\'; } return 0; } /*_______________________________________________________ */ char *FolderUp(char *path,int deep){ path=rootFolder(path); if(!*path) return path; int i=strlen(path); char *p=path; if(path[i-1]=='\') path--; while(i &&(deep>0)){ i--; if(path[i]=='\'){ p=&path[i+1]; deep--; } } return p; } /*_________________________________________________________________ */ char *NextFolder(char *path){ while(*path){ path++; if(*path=='\'){ path++; break; } } return path; } /*_________________________________________________________________ */ char *rootFolder(char *folder){ char *p; if((*folder=='\') && (folder[1]=='\')){ return NextFolder(&folder[2]); } if(*folder && folder[1]==':' && folder[2]=='\') return &folder[3]; return folder; } int chdir(/*IN_OUT*/char *curDir,const /*IN*/char *newDir){ int deep=0,i; const char *p=newDir,*tmp; if(!newDir ||!*newDir ) return 0; if(IsFullPath(newDir)){ strcpy(curDir,newDir); return 1; } if(*newDir=='\'){ tmp=rootFolder(curDir); if(*tmp!='\') tmp--; strcpy(tmp,newDir); return 1; } /**/ while(*p && (p[0]=='.' && p[1]=='.')) { if(p[2]!='\') { deep=0; break; } p+=3; deep++; } if(deep){ tmp=FolderUp(curDir,deep); if(tmp[-1]!='\') p--; strcpy(tmp,p); return 1; } i=strlen(curDir); if(i && curDir[i-1]!='\'){ curDir[i]='\'; curDir[i+1]=0; } strcat(curDir,newDir); return 1; /**/ } void DoTest(char *curDir,char *newDir){ char path[MAX_PATH]; strcpy(path,curDir); if(chdir(path,newDir)) printf("'%s' + '%s' -> %'%s'n",curDir,newDir,path); else printf("Error: an unhandled error occuredn"); return ; } int main(){ DoTest("C:\abc","def"); DoTest("C:\abc","..\def"); printf("n"); DoTest("C:\abc\","def"); DoTest("C:\abc\","..\def"); printf("n"); DoTest("\\server\share","def"); DoTest("\\server\share","..\def"); printf("n"); DoTest("\\server\share\","def"); DoTest("\\server\share\","..\def"); printf("n"); DoTest("\\server","def"); DoTest("\\server","..\def"); printf("n"); DoTest("\\server\","def"); DoTest("\\server\","..\def"); printf("n"); DoTest("c:\Folder","\\server\share"); DoTest("\\server\share","c:\Folder"); printf("n"); DoTest("..\Folder\sub folder","..\sibling"); printf("n"); return 0; }
这里是输出:
'C:abc' + 'def' -> 'C:abcdef' 'C:abc' + '..def' -> 'C:def' 'C:abc' + 'def' -> 'C:abcdef' 'C:abc' + '..def' -> 'C:def' '\servershare' + 'def' -> '\serversharedef' '\servershare' + '..def' -> '\serverdef' '\servershare' + 'def' -> '\serversharedef' '\servershare' + '..def' -> '\serverdef' '\server' + 'def' -> '\serverdef' '\server' + '..def' -> '\serverdef' '\server' + 'def' -> '\serverdef' '\server' + '..def' -> '\serverdef' 'c:Folder' + '\servershare' -> '\servershare' '\servershare' + 'c:Folder' -> 'c:Folder' '..Foldersub folder' + '..sibling' -> '..Foldersibling'
这使用WINAPI函数。
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <Shlwapi.h> //#pragma lib "Shlwapi.lib" #pragma comment( lib,"Shlwapi.lib" ) char *rootFolder(char *folder); int IsAbsolutePath(const char *p){ return !PathIsRelative(p); } /*_______________________________________________________ */ int chdir(/*IN_OUT*/char *curDir,i; char *p=(char*) newDir,*tmp; if(!newDir ||!*newDir ) return 0; /*if(IsAbsolutePath(newDir)){ strcpy(curDir,newDir); return 1; }*/ return (int) PathCombine(curDir,newDir); /**/ } /*_______________________________________________________ */ void DoTest(char *curDir,path); else printf("Error: an unhandled error occuredn"); return ; } /*_______________________________________________________ */ int main(){ DoTest("C:\abc","c:\Folder"); printf("n"); DoTest("c:\Folder","\share"); DoTest("\\server\share","\Folder"); printf("n"); DoTest("..\Folder\sub folder","..\sibling"); printf("n"); return 0; }
这是输出
'C:abc' + 'def' -> 'C:abcdef' 'C:abc' + '..def' -> 'C:def' 'C:abc' + 'def' -> 'C:abcdef' 'C:abc' + '..def' -> 'C:def' '\servershare' + 'def' -> '\serversharedef' '\servershare' + '..def' -> '\serverdef' '\servershare' + 'def' -> '\serversharedef' '\servershare' + '..def' -> '\serverdef' '\server' + 'def' -> '\serverdef' '\server' + '..def' -> '\def' '\server' + 'def' -> '\serverdef' '\server' + '..def' -> '\def' 'c:Folder' + '\servershare' -> '\servershare' '\servershare' + 'c:Folder' -> 'c:Folder' 'c:Folder' + 'share' -> 'c:share' '\servershare' + 'Folder' -> '\servershareFolder' '..Foldersub folder' + '..sibling' -> 'Foldersibling'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。