有没有办法在Python中创建NTFS交接点?我知道我可以调用该junction实用程序,但最好不要依赖外部工具.
我正在尝试创建一个NTFS Junction.从cmd行我可以使用sysinternals中的junction.exe工具执行此操作.结点的DIR cmd输出如下所示:
Volume in drive C has no label.
Volume Serial Number is C8BC-2EBD
Directory of c:\users\cheeso\Documents
03/22/2009 09:45 PM <JUNCTION> My Music [\??\c:\users\cheeso\Music]
05/11/2007 05:42 PM <DIR> My Received Files
03/22/2009 09:46 PM <JUNCTION> my videos [\??\c:\users\cheeso\Videos]
Run Code Online (Sandbox Code Playgroud)
我在某地读过Junctions是Symbolic Links的子集.
所以我尝试使用CreateSymbolicLink创建一个Junction.当我这样做时,我实际上得到了一个符号链接,而不是一个连接点.
09/09/2009 11:50 AM <SYMLINKD> newLink [.\]
Run Code Online (Sandbox Code Playgroud)
还有CreateHardLink.那里的文档说交汇点(又名"重新分析点")是硬链接的子集.但我似乎无法接受这项工作.它完成但没有创建硬链接或联结.
我正在使用.NET/C#,导入如下所示:
[Interop.DllImport("kernel32.dll", EntryPoint="CreateSymbolicLinkW", CharSet=Interop.CharSet.Unicode)]
public static extern int CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags);
[Interop.DllImport("kernel32.dll", EntryPoint="CreateHardLinkW", CharSet=Interop.CharSet.Unicode)]
public static extern bool CreateHardLink(string lpFileName, …Run Code Online (Sandbox Code Playgroud) 通常,Robocopy会忽略lastwrittendate和filesize相同的文件.我们怎样才能摆脱这种设计?我想用Robocopy强制覆盖.
我希望dst\sample.txt应该写成test001.但是这些文件被Robocopy识别为相同的文件而不会被覆盖.在这种情况下,"/ IS"选项无效.
New-Item src -itemType Directory
New-Item dst -itemType Directory
New-Item src\sample.txt -itemType File -Value "test001"
New-Item dst\sample.txt -itemType File -Value "test002"
Set-ItemProperty src\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
Set-ItemProperty dst\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
ROBOCOPY.exe src dst /COPYALL /MIR
Get-Content src\sample.txt, dst\sample.txt
> test001
> test002
ROBOCOPY.exe src dst /COPYALL /MIR /IS
Get-Content src\sample.txt, dst\sample.txt
> test001
> test002
Run Code Online (Sandbox Code Playgroud) 这是一个棘手的问题.我怀疑它需要一些文件系统的高级知识才能回答.
我有一个针对.NET framework 4.0的WPF应用程序"App1".它有一个Settings.settings文件,用于生成App1.exe.config存储默认设置的标准文件.当用户修改设置时,修改将进入AppData\Roaming\MyCompany\App1\X.X.0.0\user.config.这是所有标准的.NET行为.但是,有时,我们发现user.config客户机器上的文件不是应该的,导致应用程序崩溃.
问题看起来像这样:user.config如果用XML填充它应该是大小,但是它只是一堆NUL字符而不是XML.它的角色0一遍又一遍地重复着.我们没有关于导致此文件修改的内容的信息.
如果我们只是删除,我们可以在客户的设备上修复该问题,user.config因为公共语言运行时只会生成一个新问题.他们将失去他们对设置所做的更改,但可以再次进行更改.
但是,我在另一个带有另一个XML文件的WPF应用程序"App2"中遇到了这个问题info.xml.这次是不同的,因为文件是由我自己的代码而不是CLR生成的.常见的主题是两个都是C#WPF应用程序,都是XML文件,在这两种情况下,我们完全无法在测试中重现问题.这可能与C#应用程序与XML文件或文件交互的方式有关吗?
我们不仅无法在当前的应用程序中重现该问题,而且我甚至无法通过编写有意产生错误的自定义代码来重现该问题.我找不到单个XML序列化错误或文件访问错误导致文件填充空值.那么可能会发生什么?
App1 user.config通过调用Upgrade()以及Save()获取和设置属性来访问.例如:
if (Settings.Default.UpgradeRequired)
{
Settings.Default.Upgrade();
Settings.Default.UpgradeRequired = false;
Settings.Default.Save();
}
Run Code Online (Sandbox Code Playgroud)
info.xml通过序列化和反序列化XML来访问App2 :
public Info Deserialize(string xmlFile)
{
if (File.Exists(xmlFile) == false)
{
return null;
}
XmlSerializer xmlReadSerializer = new XmlSerializer(typeof(Info));
Info overview = null;
using (StreamReader file = new StreamReader(xmlFile))
{
overview = (Info)xmlReadSerializer.Deserialize(file);
file.Close();
}
return overview;
}
public void …Run Code Online (Sandbox Code Playgroud) 为什么我不能在NTFS文件系统中创建路径中的字符大于255的深层路径?它似乎是FAT32的限制,但也存在于NTFS中?有人可以提供一些文件吗?
非常感谢!
如果我正在读取存储在NTFS文件系统上的文件,并且我尝试在该文件仍被读取时移动/重命名该文件,我将无法这样做.如果我在UNIX文件系统(例如EXT3)上尝试此操作,则会成功,并且执行读取的进程不受影响.我甚至可以将文件和阅读过程不受影响.这是如何运作的?有人可以向我解释为什么在UNIX文件系统下支持这种行为而不支持NTFS吗?我有一种模糊的感觉,它与硬链接和inode有关,但我很感激一个很好的解释.
如上所述这里,使用SetFileInformationByHandle与FILE_DISPOSITION_INFO
允许一个设置文件有打开的句柄在被关闭所有句柄被删除.
不过,我想删除的检索基于其文件索引(磁盘ID)的文件FILE_DISPOSITION_INFO,并
OpenFileById以安全地删除其中的区别仅在情况下的目录文件/目录.这在我的用例中是安全的,因为在NTFS系统上,文件索引在删除之前是持久的,否定ReplaceFile当前代码库处理的使用.
但是,在尝试删除句柄时,我收到错误87(ERROR_INVALID_PARAMETER).如果我使用创建的句柄删除CreateFileW,我遇到没有问题.但是,我无法做到这一点,因为Windows无法区分同一案例的两个文件/文件夹,即使NTFS可以.
我也知道打开硬链接文件存在歧义OpenFileById,因为硬链接文件共享相同的磁盘ID.可以认为硬链接文件的问题与此方案无关.我只会按ID删除目录,不能硬链接.
我的OpenFileById通话中是否有参数或设置?不知怎的,在我的SetFileInformationByHandle电话里?
我试过的其他方法:
DuplicateHandle与OpenFileById处理,提供DELETE了dwDesiredAccess和使用.ERROR_INVALID_PARAMETER结果相同.ReOpenFile与OpenFileById处理,提供DELETE了dwDesiredAccess和使用.ERROR_INVALID_PARAMETER结果相同.ReOpenFile与OpenFileById处理,提供DELETE了dwDesiredAccess,并提供FILE_FLAG_DELETE_ON_CLOSE标志.没有给出错误,但在关闭所有句柄后文件仍然存在.这是一个简单但完整的示例,它可以重现问题:
#include <stdio.h>
#include <sys/stat.h>
#include <Windows.h>
DWORD getFileID(LPCWSTR path, LARGE_INTEGER *id)
{
HANDLE h …Run Code Online (Sandbox Code Playgroud) 我正在测试一个稀疏文件.但我的测试代码效果不佳.
HANDLE h = CreateFileW(L"D:\\sparse.test",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
0,
CREATE_ALWAYS,
FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SPARSE_FILE,
0);
DWORD d = GetFileAttributes(L"D:\\sparse.test");
// The function returns 32(FILE_ATTRIBUTE_ARCHIVE).
// Where is FILE_ATTRIBUTE_SPARSE_FILE flag?
// How do I make a sparse file.
DWORD written;
WriteFile(h, "aaa", 3, &written, 0);
SetFilePointer(h, 2*1024*1024*1023, 0, FILE_BEGIN);
SetEndOfFile(h);
WriteFile(h, "bbb", 3, &written, 0);
Run Code Online (Sandbox Code Playgroud) 我正在编写的应用程序需要能够复制被锁定的文件.我们尝试使用卷影复制,虽然它成功复制了文件,但是对文件进行锁定的应用程序崩溃了,因为在我们复制文件时它无法获取锁定.
我不得不相信我唯一的选择是绕过操作系统并直接从磁盘读取.问题是如果我直接读到磁盘我不能确定文件的完整性,如果它在写入的中间,文件将处于损坏状态.
经过几个小时的搜索,我能够找到一个直接从磁盘复制文件的实用程序,并使用文件系统驱动程序在复制时缓存写入,以便确保文件处于完整状态.但是,该实用程序非常昂贵,我可能需要使用的许可证为100k +.
有没有人对如何完成我想要的事情有任何想法?
我们计划仅将系统限制为NTFS卷.
对不起,我知道这听起来像是一个新手问题.但说真的,我是一个经验丰富的开发人员,我明白Windows 7 Pro 64位之类的人会说,"哦,如果你将一个NTFS树从一个驱动器移动到另一个驱动器,当我编写那些真正意味着的子文件时我正在修改父文件夹,所以我将更新其时间戳." 所以我最终得到的所有目标文件都具有与原始文件相同的时间戳,但所有文件夹都具有相同的刚刚修改的日期/时间.
所以我明白发生了什么.而且我知道我可以编写自己的实用程序(我有)在NTFS上复制/移动文件.但实用程序存在风险 - 如果它们不支持NTFS,它们可能会忽略其他属性或错过NTFS备用数据流(ADS)等.
那么有没有人知道一个好的,NTFS感知的树移动实用程序,它只需移动所有树并保持时间戳?我不想冒任何损失的风险.谢谢.