如果文件不存在,我需要创建一个文件,试图创建此文件的另一个进程将失败.我甚至需要在创建过程完成向其写入实际数据之前将文件视为"已创建".
我读到了O_EXCL标志open(),所以似乎解决方案存在,但我有几个问题:
open()以便将其视为已创建,然后重新打开以进行写入?演示我的问题
Sub test()
strCRLF = StrConv(vbCrLf, vbUnicode)
strSpecialchars = StrConv(Cells(1, 1), vbUnicode)
strFilename = "c:\test.txt"
Open strFilename For Output As #1
Print #1, strSpecialchars & strCRLF;
Close #1
End Sub
您将获得一个包含[A1]中文字符的文本文件.这证明了如果你知道添加的技巧,VBA能够处理unicode字符StrConv(vbCrLf, vbUnicode)
现在尝试相同的strFilename = "C:\" & strSpecialchars & ".txt".您将收到一个错误,您无法使用此文件名创建文件.当然,你不能使用相同的技巧添加一个新行,因为它的文件名.
如何使用VBA在文件名中创建包含特殊字符的文本文件?
是否有解决方法或我做错了什么?
注意
目录some_folder,some_folder_1,some_folder_2和some_folder_3最初不存在.
File folder1 = new File("some_folder/some_folder_1");
File folder2 = new File("some_folder/some_folder_2");
File folder3 = new File("some_folder/some_folder_3");
if(!folder1.exists()) {
folder1.mkdirs();
}
if(!folder2.exists()) {
folder2.mkdirs();
}
if(!folder3.exists()) {
folder3.mkdirs();
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法吗?
在我的Android应用程序中,我尝试在SD卡上创建一个xml文件.我试过这个:
public class XmlFileCreator extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println(Environment.getExternalStorageDirectory());
// create a new file called "new.xml" in the SD card
File newxmlfile = new File( Environment.getExternalStorageDirectory(),"new.xml");
try {
newxmlfile.createNewFile();
} catch (IOException e) {
Log.e("IOException", "exception in createNewFile() method");
}
FileOutputStream fileos = null;
try {
fileos = new FileOutputStream(newxmlfile);
} catch (FileNotFoundException e) {
Log.e("FileNotFoundException", "can't create FileOutputStream");
}
// we create a XmlSerializer in order to write xml data
XmlSerializer serializer …Run Code Online (Sandbox Code Playgroud) 我试图同时读取两个不同应用程序中的日志文件。但是使用共享模式 #FILE_SHARE_READ 的CreateFile ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx ) 在第二次调用时总是失败,并出现错误 -代码 32:ERROR_SHARING_VIOLATION: - 该进程无法访问该文件,因为该文件正在被另一个进程使用。
当日志文件以 FILE_SHARE_WRITE 或 FILE_SHARE_READ 模式写入时 | FILE_SHARE_WRITE 仅当 FILE_SHARE_READ 用于写入应用程序时,两个应用程序中的任何一个都无法读取该文件,并且仅当读取应用程序使用 FILE_SHARE_WRITE 或 FILE_SHARE_READ | FILE_SHARE_WRITE 时,该文件才有效。#FILE_SHARE_WRITE,而不是使用#FILE_SHARE_READ 时。奇怪....有什么建议吗?
非常感谢。
修正案:
Writer-Application: CreateFile(file,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
Reader-Applications: CreateFile(file,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
Run Code Online (Sandbox Code Playgroud)
修正2:
当使用第一修正案中的调用时,第一个读取器应用程序可以成功获取文件句柄,但第二个读取器应用程序将失败并出现 ERROR_SHARING_VIOLATION。
修正3:有人给我指出了解决方案!
问题是我在共享模式中使用逻辑或而不是按位或:FILE_SHARE_READ或FILE_SHARE_WRITE = 1或2 = 1,但它应该是FILE_SHARE_READ | 文件共享写入 = 1 | 2 = 3。因此无法工作,因为写入应用程序需要 FILE_SHARE_WRITE。
我创建一个.vbs文件(可以:创建文本文件->打开notepad.exe->删除上面的文件),如下所示:
' Create a new file
Dim objFS, objFile
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.CreateTextFile("D:\Folder\Textfile.txt")
objFile.WriteLine ("sample text")
' Run a program and wait
WScript.CreateObject("WScript.Shell").Run "notepad.exe", 1, true
' Delete file
objFS.Deletefile("D:\Folder\Textfile.txt")
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,关闭记事本窗口后,它显示错误消息:
Line: 10
Char: 1
Error: Permission denied
Code: 800A0046
Source: Microsoft VBScript runtime error
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这个.vbs无法删除文本文件?感谢您的任何帮助!
每次我的函数被调用时,它都会覆盖到文件中。请注意,我正在使用以下标志以无缓冲模式打开文件。
FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH
如果我使用简单的缓冲模式,它工作正常。
FILE_ATTRIBUTE_NORMAL
我在无缓冲模式下遇到以下错误。
** 错误 ** CreateFile 失败:参数不正确。
请在下面找到代码片段。这段代码被多次调用。
HANDLE hFile;
LPCWSTR file_path = convertCharArrayToLPCWSTR(UNBUFFERED_FILE);
hFile = CreateFile(file_path,
FILE_APPEND_DATA,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH,
NULL
);
if (hFile == INVALID_HANDLE_VALUE)
{
std::cout << "Unable to open/create file for writing" << std::endl;
PrintError(TEXT("CreateFile failed"));
}
Data *data = new Data();
DWORD dwBytesToWrite = sizeof(Data);
DWORD dwBytesWritten = 0;
BOOL bErrorFlag = FALSE;
bErrorFlag = WriteFile(
hFile, // open file handle
data, // start of data to …Run Code Online (Sandbox Code Playgroud) 我正在开发一个从服务器收集文本内容的应用程序,下一步我尝试将它们保存到单独的文件中,以便保存在应用程序存储中。存储是一个名为“存储”的文件夹。在存储内部,有一个“ fileList.txt ”文件,其中包含文件列表。
在pubspec.yaml中,我在资产中声明了该文件夹,如下所示:
assets:
- storage/
Run Code Online (Sandbox Code Playgroud)
我可以使用以下函数读取它:
Future<String> readFileContent() async {
String response;
response =
await rootBundle.loadString('storage/fileList.txt');
return response;
}
Run Code Online (Sandbox Code Playgroud)
为了保存文件,我使用了使用“ path_provider ”包的在线示例。但是,当我尝试使用以下函数保存下载的文件之一(例如“ file4.dat ”)时,我遇到以下错误。我该如何解决这个问题?
saveFileLocally() async {
await _writeFile();
}
Future<Null> _writeFile() async {
await (await _getLocalFile()).writeAsString(vars.fileContents);
}
Future<File> _getLocalFile() async {
// get the path to the document directory.
String dir = (await PathProvider.getApplicationSupportDirectory()).path;
print('DIR :::: ' + dir);
return new File(
'$dir/storage/files/file' + vars.newFileID.toString() + '.dat');
}
Run Code Online (Sandbox Code Playgroud)
错误是:
Unhandled Exception: FileSystemException: Cannot open file, …Run Code Online (Sandbox Code Playgroud) 我使用 C# 尝试了以下操作:
File.CreateText("x.y");
folderBrowserDialog1.ShowDialog();
string dir = folderBrowserDialog1.SelectedPath.ToString();
File.WriteAllText("x.y", dir);
Run Code Online (Sandbox Code Playgroud)
但是当我运行该程序时,它说该进程无法访问该文件(xy),因为它正在被另一个进程使用。
[在file.WriteAllText]
提前致谢。
我的方法中有这样的实现
std::string name2 = "D:\\Buffer\\Temp\\t_libpng" + std::to_string(i) + ".png";
Run Code Online (Sandbox Code Playgroud)
bool _write_png_file_cv2_(char const *filename,
int width,
int height,
int widthStep,
png_byte color_type,
png_byte bit_depth,
png_bytep *row_pointers)
{
// ...
hFile = CreateFile((LPCWSTR)filename, // Open Two.txt.
GENERIC_WRITE, // Open for writing
0, // Do not share
NULL, // No security
OPEN_ALWAYS, // Open or create
FILE_ATTRIBUTE_NORMAL, // Normal file
NULL); // No template file
if (hFile == INVALID_HANDLE_VALUE)
{
printf("ERROR:: Could not open file");
CloseHandle(hFile); // Close the first file.
return false; …Run Code Online (Sandbox Code Playgroud) createfile ×10
c++ ×4
file ×3
c# ×2
winapi ×2
android ×1
atomicity ×1
delete-file ×1
denied ×1
directory ×1
excel-2003 ×1
file-io ×1
filesystems ×1
flutter ×1
java ×1
linux ×1
path ×1
permissions ×1
process ×1
provider ×1
try-catch ×1
unbuffered ×1
vba ×1
windows ×1