我知道这FILE_FLAG_POSIX_SEMANTICS允许文件名区分大小写,但它没有命名的事实FILE_FLAG_CASE_SENSITIVE让我认为它可能做的不止于此。
它还有其他作用吗,还是我分析得太深入了?
如何创建一个新文件,我打算在Perl中使用open()在现有目录中编写?
我试过这样的:
my $existingdir = './mydirectory';
open my $fileHandle, ">>", "$existingdir/filetocreate.txt" or die "Can't open '$existingdir/filetocreate.txt'\n";
Run Code Online (Sandbox Code Playgroud)
但它不会起作用.
我最近花了一段时间试图弄清楚需要哪些权限才能使该语句发挥作用:
if (!File.Exists(path))
{
// Create a file to write to.
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine("Hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
}
}
Run Code Online (Sandbox Code Playgroud)
我最终对“每个人”都拥有“特殊权限”,这应该可以解决问题。遗憾的是它没有,这实际上可能是一个错误?
以下作品:
if (!File.Exists(_logFilePath))
{
using (var fs = File.Create(_logFilePath))
{
using (var sw = new StreamWriter(fs))
{
sw.WriteLine("Hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
}
}
}
Run Code Online (Sandbox Code Playgroud)
理论上是相同的(我认为),但我无法让第一个工作。
可以CreateFile()在两个不同的线程中同时打开一个文件
void new_function(void * what)
{
HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE |
FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE)
{
DWORD d = GetLastError();
return ;
}
Sleep(10000);
Run Code Online (Sandbox Code Playgroud)
}
int main()
{
HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Sleep(10000);
return 1;
Run Code Online (Sandbox Code Playgroud)
}
每次它退出该GetLastError位置.并且错误是ERROR_SHARING_VIOLATION(32,"进程无法访问该文件,因为它正由另一个进程使用.")
如果我canot共享打开文件,那么有什么用 FILE_SHARE_WRITE | FILE_SHARE_READ
感谢名单
The program environment is Win32 Vs2003
当使用Windows CreateFile函数寻址串口时,我似乎遇到了一些TEXT/UNICODE问题.有人可以请帮助指出我的错误?
我正在使用VS 2008在VC++中编写Win32控制台应用程序.
我可以创建一个句柄来解决串口问题,如下所示:
#include <iostream>
#include <windows.h>
#include <string>
int main()
{
HANDLE hSerial;
hSerial = CreateFile( L"\\\\.\\COM20",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);`
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作(\\\\.\\对于大于COM9的comports来说,这个位是必需的,对于那些直到COM9的那些也是如此).问题是我的comport并不总是COM20,所以我想让用户指定它是什么.
以下是我尝试过的一些事情:
#include <iostream>
#include <windows.h>
#include <string>
int main()
{
std::string comNum;
std::cout << "\n\nEnter the port (ex: COM20): ";
std::cin >> comNum;
std::string comPrefix = "\\\\.\\";
std::string comID = comPrefix+comNum;
HANDLE hSerial;
hSerial = CreateFile( comID,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);`
return …Run Code Online (Sandbox Code Playgroud) 我想使用Windows C/C++ API创建任意大小的文件.我正在使用具有32位虚拟地址内存空间的Windows XP Service Pack 2.我熟悉CreateFile.
然而,CreateFile没有大小arument,我想传递一个size参数的原因是允许我创建内存映射文件,允许用户访问预定大小的数据结构.你能否告诉我正确的Windows C/C++ API函数,它允许我创建一个预定大小的arcoitrary文件?谢谢
我正在尝试CreateFile使用JNA在Windows 7上调用Win32的功能,目的是执行此答案的Java实现,以检查文件是否正由另一个进程使用.
我到目前为止的代码是:
import com.sun.jna.Native;
import com.sun.jna.examples.win32.Kernel32;
public class CreateFileExample {
static int GENERIC_ACCESS = 268435456;
static int EXCLUSIVE_ACCESS = 0;
static int OPEN_EXISTING = 3;
public static void main(String[] args) {
Kernel32 kernel32 =
(Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
kernel32.CreateFile("c:\\file.txt", GENERIC_ACCESS, EXCLUSIVE_ACCESS,
null, OPEN_EXISTING, 0, null);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,运行它会引发异常:
java.lang.UnsatisfiedLinkError: Error looking up function 'CreateFile': The specified procedure could not be found.
如果我"kernel32"将loadLibrary调用更改为无效的东西,那么我得到The specified module could not be found这样的结果表明正在从库路径中正确找到DLL,但是我调用的方式有问题CreateFile. …
我需要以原始模式打开读取磁盘,因此我使用 CreateFile API 函数来实现此目的。
private static FileStream OpenDisk(string drive)
{
// Try to open hard disk drive in raw mode for reading
SafeFileHandle safeHandle = Native.CreateFile(
string.Format(@"\\.\{0}", drive),
FileAccess.Read,
FileShare.Read,
IntPtr.Zero,
FileMode.Open,
FileAttributes.ReadOnly | FileAttributes.Device,
IntPtr.Zero);
// Check if the drive was successfully opened
if (safeHandle.IsInvalid)
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
// Create file stream on the file for reading
return new FileStream(safeHandle, FileAccess.Read);
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从流中读取时出现以下错误
Handle does not support synchronous operations. The parameters to the FileStream constructor may need to be …
例如,如果我想将file.txt写入/ folder1/folder2/folder3 /并且没有文件夹存在.
这是手动创建它们的唯一方法吗?
我试图通过我的USB端口(名为COM15)进行一些串行通信,我收到一个错误.这是发生错误的代码:
HANDLE myPortHandle = CreateFile("COM15",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (myPortHandle == INVALID_HANDLE_VALUE)
{
DWORD lastError = GetLastError();
cout<<"ERROR HERE! = "<<lastError<<endl;
}
Run Code Online (Sandbox Code Playgroud)
每次编译程序时,打开的串口的句柄== INVALID_HANDLE_VALUE.我在CreateFile()msdn文档中读到了使用GetLastError()以获取"扩展错误信息".现在......当我运行代码时,GetLastError()返回值:2
在GetLastError()的msdn文档中,它说:
"设置最后错误代码的每个函数的文档的返回值部分说明了函数设置最后错误代码的条件."
我试图在CreateFile()msdn文档的返回值部分中查找'2'的含义,但无法在任何地方找到含义.
题:
1)为什么会发生这种情况:myPortHandle == INVALID_HANDLE_VALUE?
2)另外,如果有人可以指引我到msdn文档中查找GetLastError()返回的'2'的含义,那就太棒了!
createfile ×10
c++ ×3
winapi ×3
c ×2
c# ×2
.net ×1
directory ×1
exists ×1
file ×1
file-exists ×1
file-io ×1
getlasterror ×1
java ×1
jna ×1
objective-c ×1
perl ×1
string ×1
unicode ×1